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(); } }); } }
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!