初期コードと不一致:
提供されたコード スニペットは、達成しようとしましたテキストオーバーレイは表示されましたが、目に見える変更を加えることができませんでしたimage.問題:
問題は、drawString() メソッドが x 座標と y 座標を解釈する方法にあります。これらの座標は、テキストの左上隅ではなく、最初の文字のベースラインの位置を示します。したがって、フォントやディセンダ (「g」や「p」などの文字) の存在によっては、テキストが画像の境界の外に出てしまう可能性があります。解決策:
これに対処するには、テキストの位置を調整する必要があります。 x と y を直接使用する代わりに、まず現在の Font オブジェクトの FontMetrics を取得します。 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 中国語 Web サイトの他の関連記事を参照してください。