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

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

Patricia Arquette
Libérer: 2024-11-29 06:34:14
original
362 Les gens l'ont consulté

How to Correctly Overlay Text onto a BufferedImage using Java's Graphics2D?

Utilisation de Graphics2D pour superposer du texte sur une BufferedImage et renvoyer une BufferedImage

Dans cet exemple, nous montrons comment superposer du texte sur une BufferedImage à l'aide de Graphics2D. Notre objectif est de fournir une solution pour restituer le texte directement sur l'image et renvoyer l'image tampon modifiée.

Code initial et divergence :

L'extrait de code fourni a tenté d'atteindre la superposition de texte mais n'a pas réussi à apporter de modifications visibles au image.

Problème :

Le problème réside dans la façon dont la méthode drawString() interprète les coordonnées x et y. Ces coordonnées indiquent la position de la ligne de base du premier caractère, et non le coin supérieur gauche du texte. Ainsi, selon la police et la présence de descendants (caractères comme "g" ou "p"), le texte peut se retrouver en dehors des limites de l'image.

Solution :

Pour résoudre ce problème, nous devons ajuster le positionnement du texte. Au lieu d'utiliser x et y directement, nous obtenons d'abord les FontMetrics pour l'objet Font actuel. Le FontMetrics nous permet de calculer les décalages nécessaires pour positionner correctement le texte.

Plus précisément, nous calculons le décalage horizontal pour garantir que le texte est centré dans la largeur disponible, et nous ajustons le décalage vertical pour éviter de couper le texte. texte.

Code réécrit avec exemple :

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TextOverlay extends JPanel {

    private BufferedImage image;

    public TextOverlay() {
        try {
            image = ImageIO.read(new URL(
                "http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        image = process(image);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(image.getWidth(), image.getHeight());
    }

    private BufferedImage process(BufferedImage old) {
        int w = old.getWidth() / 3;
        int h = old.getHeight() / 3;
        BufferedImage img = new BufferedImage(
            w, h,BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();
        g2d.drawImage(old, 0, 0, w, h, this);
        g2d.setPaint(Color.red);
        g2d.setFont(new Font("Serif", Font.BOLD, 20));
        String s = "Hello, world!";
        FontMetrics fm = g2d.getFontMetrics();
        int x = img.getWidth() - fm.stringWidth(s) - 5;
        int y = fm.getHeight();
        g2d.drawString(s, x, y);
        g2d.dispose();
        return img;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new TextOverlay());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }
}
Copier après la connexion

Dans ce code modifié, nous calculons correctement le décalages en fonction des métriques de police et restituer le texte en conséquence. En conséquence, le texte superposé sera correctement positionné dans l'image.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal