使用Graphics2D覆盖BufferedImage上的文本并返回一个BufferedImage

我查了类似命名的问题,但是他们没有回答这个用例。

基本上,我是覆盖一些文本(文本)在给定的坐标(x,y)我有一个包中的下面的function;

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

我觉得我很明显错过了一些东西。 我可以findGraphics2D的每一个引用是处理游戏或直接写入文件,但我只想要一个BufferedImage返回。 与覆盖“渲染”

在当前的代码中,图像显示在最后不变。

谢谢!

drawString()方法使用xy作为最左边字符的基线 。 数字通常没有下行; 如果text是相同的,则在位置(0,0)处绘制的string将完全呈现在图像之外。 看到这个例子 。

附录:您可能会遇到图像中颜色模型不兼容的问题。 一个简单的方法是渲染图像,然后就地修改它。

你好

 import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; 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; /** * @see https://stackoverflow.com/questions/2658663 */ public class TextOverlay extends JPanel { private BufferedImage image; public TextOverlay() { try { image = ImageIO.read(new URL( "Sites/stackoverflow/company/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) { EventQueue.invokeLater(new Runnable() { @Override public void run() { create(); } }); } }