Maison >Java >javaDidacticiel >Comment superposer correctement du texte sur une image tamponnée à l'aide de Graphics2D ?

Comment superposer correctement du texte sur une image tamponnée à l'aide de Graphics2D ?

DDD
DDDoriginal
2024-12-21 12:49:09998parcourir

How to Correctly Overlay Text onto a BufferedImage using Graphics2D?

Utilisation de Graphics2D pour ajouter des superpositions de texte sur une image tamponnée

Cette question concerne la superposition de texte sur une image tamponnée à l'aide de Graphics2D. Le but est de restituer l'image finale avec le texte ajouté.

Description du problème

L'extrait de code fourni tente de superposer du texte à des coordonnées spécifiques à l'aide de Graphics2D :

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;
}

Cependant, l'image de sortie reste inchangé.

Solution

1. Ligne de base pour le rendu du texte :

  • La méthode drawString() dans Graphics2D interprète les coordonnées spécifiées comme ligne de base pour le caractère le plus à gauche. Cela implique que le texte peut être rendu en dehors de l'image s'il contient des caractères qui s'étendent en dessous de la ligne de base, tels que des descendants en lettres minuscules ou en chiffres.

2. Compatibilité du modèle de couleur de l'image :

  • Le modèle de couleur de l'image doit être compatible avec le texte superposé. Le code fourni tente de modifier directement une image, ce qui peut entraîner des résultats inattendus si l'image a un modèle de couleur incompatible.

Code révisé utilisant le texte rendu sur l'image :

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;
    }
}

Utilisation :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn