Heim >Java >javaLernprogramm >Wie kann ich mit Graphics2D Text korrekt auf ein BufferedImage überlagern?

Wie kann ich mit Graphics2D Text korrekt auf ein BufferedImage überlagern?

DDD
DDDOriginal
2024-12-21 12:49:091001Durchsuche

How to Correctly Overlay Text onto a BufferedImage using Graphics2D?

Verwenden von Graphics2D zum Hinzufügen von Textüberlagerungen zu einem BufferedImage

Diese Frage bezieht sich auf die Überlagerung von Text auf einem BufferedImage mithilfe von Graphics2D. Ziel ist es, das endgültige Bild mit dem hinzugefügten Text zu rendern.

Problembeschreibung

Das bereitgestellte Code-Snippet versucht, Text an bestimmten Koordinaten mit Graphics2D zu überlagern:

protected BufferedImage Process2(BufferedImage image){
    Graphics2D gO = image.createGraphics();
    gO.setColor(Color.red);
    gO.setFont(new Font( "SansSerif", Font.BOLD, 12 ));
    gO.drawString(this.text, this.x, this.y);
    System.err.println(this.text+this.x+this.y);
    return image;
}

Das Ausgabebild bleibt jedoch erhalten unverändert.

Lösung

1. Basislinie für die Textwiedergabe:

  • Die Methode drawString() in Graphics2D interpretiert die angegebenen Koordinaten als Basislinie für das Zeichen ganz links. Dies bedeutet, dass der Text möglicherweise außerhalb des Bildes gerendert wird, wenn er Zeichen enthält, die über die Grundlinie hinausgehen, wie z. B. Unterlängen in Kleinbuchstaben oder Zahlen.

2. Kompatibilität des Bildfarbmodells:

  • Das Farbmodell des Bildes muss mit überlagertem Text kompatibel sein. Der bereitgestellte Code versucht, ein Bild direkt zu ändern, was zu unerwarteten Ergebnissen führen kann, wenn das Bild ein inkompatibles Farbmodell hat.

Überarbeiteter Code unter Verwendung von gerendertem Text auf dem Bild:

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

public class TextOverlay {

    public static BufferedImage process(BufferedImage image, String text, int x, int y) {
        int w = image.getWidth();
        int h = image.getHeight();
        BufferedImage processed = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

        // Create Graphics2D object for the processed image
        Graphics2D g2 = processed.createGraphics();

        // Transfer the contents of the original image to the processed image
        g2.drawImage(image, 0, 0, w, h, null);

        // Set the text color and font
        g2.setColor(Color.red);
        Font font = new Font("SansSerif", Font.BOLD, 12);
        g2.setFont(font);

        // Get the font metrics to determine the bounding box for the text
        FontMetrics fm = g2.getFontMetrics(font);
        int textWidth = fm.stringWidth(text);
        int textHeight = fm.getAscent() - fm.getDescent();

        // Calculate the coordinates for the text so that it is centered at the specified location
        int textX = x - textWidth / 2;
        int textY = y + textHeight / 2;

        // Draw the text on the processed image
        g2.drawString(text, textX, textY);

        // Dispose of the Graphics2D object
        g2.dispose();

        return processed;
    }
}

Verwendung:

BufferedImage image = ... // Load your original image

String text = "Hello, world!";
int x = 100;
int y = 100;

BufferedImage processedImage = TextOverlay.process(image, text, x, y);

// Use the processed image as needed

Das obige ist der detaillierte Inhalt vonWie kann ich mit Graphics2D Text korrekt auf ein BufferedImage überlagern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn