Hinzufügen von Text zu einem Bild in Java

1. Übersicht

Manchmal müssen wir einem Bild oder einer Reihe von Bildern Text hinzufügen. Dies manuell zu tun ist einfach mit einem Bildbearbeitungswerkzeug. Wenn wir jedoch einer signifikanten Anzahl von Bildern denselben Text auf dieselbe Weise hinzufügen möchten, wäre es sehr nützlich, dies programmgesteuert zu tun.

In diesem kurzen Tutorial lernen wir, wie Sie Bildern mit Java Text hinzufügen .

2. Hinzufügen von Text zu einem Bild

Um ein Bild zu lesen und Text hinzuzufügen, können wir verschiedene Klassen verwenden. In den folgenden Abschnitten werden wir einige Optionen sehen.

2.1. ImagePlus und ImageProcessor

Lassen Sie uns zunächst sehen, wie Sie die Klassen ImagePlus und ImageProcessor verwenden , die in der ImageJ-Bibliothek verfügbar sind. Um diese Bibliothek nutzen zu können, müssen wir diese Abhängigkeit in unser Projekt aufnehmen:

 net.imagej ij 1.51h 

Zum Lesen des Bildes verwenden wir die statische Methode openImage . Das Ergebnis dieser Methode wird mithilfe eines ImagePlus- Objekts im Speicher gespeichert :

ImagePlus image = IJ.openImage(path);

Sobald wir das Bild in den Speicher geladen haben, fügen wir ihm mit der Klasse ImageProcessor Text hinzu :

Font font = new Font("Arial", Font.BOLD, 18); ImageProcessor ip = image.getProcessor(); ip.setColor(Color.GREEN); ip.setFont(font); ip.drawString(text, 0, 20);

Mit diesem Code fügen wir den angegebenen Text oben links im Bild in Grün hinzu. Beachten Sie, dass wir die Position mit dem zweiten und dritten Argument der drawString- Methode festlegen , die die Anzahl der Pixel von links bzw. oben darstellen.

2.2. BufferedImage und Grafiken

Als nächstes werden wir sehen, wie wir mit den Klassen BufferedImage und Graphics das gleiche Ergebnis erzielen können . Der Standard-Build von Java enthält diese Klassen, sodass keine zusätzlichen Bibliotheken erforderlich sind.

Auf die gleiche Weise haben wir Openimage von ImageJ , wir werden das verwenden Lesemethode in ImageIO :

BufferedImage image = ImageIO.read(new File(path));

Sobald wir das Bild in den Speicher geladen haben, fügen wir ihm mithilfe der Klasse Grafik Text hinzu :

Font font = new Font("Arial", Font.BOLD, 18); Graphics g = image.getGraphics(); g.setFont(font); g.setColor(Color.GREEN); g.drawString(text, 0, 20);

Wie wir sehen können, sind beide Alternativen in der Art und Weise, wie sie verwendet werden, sehr ähnlich. In diesem Fall werden das zweite und das dritte Argument der Methode drawString auf dieselbe Weise angegeben, wie wir es für die ImageProcessor- Methode getan haben .

2.3. Zeichnen basierend auf AttributedCharacterIterator

Mit der in Graphics verfügbaren Methode drawString können wir den Text mit einem AttributedCharacterIterator drucken . Dies bedeutet, dass wir anstelle einer einfachen Zeichenfolge Text mit einigen zugeordneten Eigenschaften verwenden können. Sehen wir uns ein Beispiel an:

Font font = new Font("Arial", Font.BOLD, 18); AttributedString attributedText = new AttributedString(text); attributedText.addAttribute(TextAttribute.FONT, font); attributedText.addAttribute(TextAttribute.FOREGROUND, Color.GREEN); Graphics g = image.getGraphics(); g.drawString(attributedText.getIterator(), 0, 20);

Auf diese Weise den Text zu drucken gibt uns die Möglichkeit , das Format direkt mit dem verbinden String , der sauberer ist als Wechsel Graphics Objekteigenschaften , wenn wir das Format ändern möchten.

3. Textausrichtung

Nachdem wir nun gelernt haben, wie man oben links in einem Bild einen einfachen Text hinzufügt, wollen wir nun sehen, wie wir diesen Text an bestimmten Positionen hinzufügen können .

3.1. Zentrierter Text

Die erste Art der Ausrichtung, die wir angehen werden, ist das Zentrieren des Textes . Um dynamisch die richtige Position festzulegen, an der wir den Text schreiben möchten, müssen wir einige Informationen herausfinden:

  • Bildgröße
  • Schriftgröße

Diese Informationen können sehr leicht erhalten werden. In dem Fall der Bildgröße, können diese Daten durch die Methoden zugegriffen werden getWidth und getHeight des BufferedImage Objekts. Um die Daten zur Schriftgröße zu erhalten, müssen Sie das Objekt FontMetrics verwenden .

Sehen wir uns ein Beispiel an, in dem wir die richtige Position für unseren Text berechnen und zeichnen:

Graphics g = image.getGraphics(); FontMetrics metrics = g.getFontMetrics(font); int positionX = (image.getWidth() - metrics.stringWidth(text)) / 2; int positionY = (image.getHeight() - metrics.getHeight()) / 2 + metrics.getAscent(); g.drawString(attributedText.getIterator(), positionX, positionY);

3.2. Text unten rechts ausgerichtet

Die nächste Art der Ausrichtung, die wir sehen werden, ist unten rechts . In diesem Fall müssen wir dynamisch die richtigen Positionen ermitteln:

int positionX = (image.getWidth() - metrics.stringWidth(text)); int positionY = (image.getHeight() - metrics.getHeight()) + metrics.getAscent();

3.3. Text befindet sich oben links

Lassen Sie uns abschließend sehen, wie Sie unseren Text oben links drucken :

int positionX = 0; int positionY = metrics.getAscent();

Der Rest der Ausrichtungen kann aus den drei, die wir gesehen haben, abgeleitet werden.

4. Anpassen der Textgröße basierend auf dem Bild

Wenn wir den Text im Bild zeichnen, stellen wir möglicherweise fest, dass dieser Text die Größe des Bildes überschreitet. Um dies zu lösen, müssen wir die Größe der verwendeten Schriftart basierend auf der Bildgröße anpassen .

Zunächst müssen wir die erwartete Breite und Höhe des Texts mithilfe der Basisschrift ermitteln. Um dies zu erreichen, verwenden wir die Klassen FontMetrics , GlyphVector und Shape .

FontMetrics ruler = graphics.getFontMetrics(baseFont); GlyphVector vector = baseFont.createGlyphVector(ruler.getFontRenderContext(), text); Shape outline = vector.getOutline(0, 0); double expectedWidth = outline.getBounds().getWidth(); double expectedHeight = outline.getBounds().getHeight(); 

Der nächste Schritt besteht darin, zu überprüfen, ob die Größe der Schriftart geändert werden muss. Vergleichen wir zu diesem Zweck die erwartete Größe des Textes und die Größe des Bildes:

boolean textFits = image.getWidth() >= expectedWidth && image.getHeight() >= expectedHeight;

Wenn unser Text nicht in das Bild passt, müssen wir die Schriftgröße reduzieren. Wir werden dafür die Methode deriveFont verwenden :

double widthBasedFontSize = (baseFont.getSize2D()*image.getWidth())/expectedWidth; double heightBasedFontSize = (baseFont.getSize2D()*image.getHeight())/expectedHeight; double newFontSize = widthBasedFontSize < heightBasedFontSize ? widthBasedFontSize : heightBasedFontSize; newFont = baseFont.deriveFont(baseFont.getStyle(), (float)newFontSize);

Beachten Sie, dass wir die neue Schriftgröße basierend auf Breite und Höhe erhalten und die niedrigste davon anwenden müssen.

5. Zusammenfassung

In diesem Artikel haben wir gesehen, wie Sie mit verschiedenen Methoden Text in ein Bild schreiben.

Wir haben auch gelernt, wie Sie basierend auf der Bildgröße und den Schrifteigenschaften dynamisch die Position ermitteln, an der wir unseren Text drucken möchten.

Endlich haben wir gesehen, wie Sie die Schriftgröße des Textes anpassen können, falls er die Größe des Bildes überschreitet, in dem wir ihn zeichnen.

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.