在此範例中,我們示範如何使用 Graphics2D 在 BufferedImage 上疊加文字。我們的目標是提供一種將文字直接渲染到圖像上並返回修改後的 BufferedImage 的解決方案。
初始程式碼與差異:
提供的程式碼片段試圖實現文字覆蓋但未能對
問題:
問題在於drawString()方法如何解釋x和y座標。這些座標表示第一個字元的基線位置,而不是文字的左上角。因此,根據字體和下行字母(“g”或“p”等字元)的存在,文字可能最終會超出圖像邊界。
解:
為了解決這個問題,我們需要調整文字的位置。我們首先取得目前 Font 物件的 FontMetrics,而不是直接使用 x 和 y。 FontMetrics 讓我們可以計算正確定位文字所需的偏移量。
具體來說,我們計算水平偏移量以確保文字在可用寬度內居中,並調整垂直偏移量以避免剪切文字text.
用範例重寫程式碼:
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(); } }); } }
在此修改程式碼後,我們根據字體規格正確計算偏移量並相應地渲染文字。因此,覆蓋文字將正確定位在影像內。
以上是如何使用 Java 的 Graphics2D 正確地將文字覆蓋到 BufferedImage 上?的詳細內容。更多資訊請關注PHP中文網其他相關文章!