이 예에서는 Graphics2D를 사용하여 버퍼링된 이미지에 텍스트를 오버레이하는 방법을 보여줍니다. 우리는 텍스트를 이미지에 직접 렌더링하고 수정된 BufferedImage를 반환하는 솔루션을 제공하는 것을 목표로 합니다.
초기 코드 및 불일치:
제공된 코드 조각은 다음을 달성하려고 시도했습니다. 텍스트 오버레이가 표시되었지만 눈에 띄는 변경 사항을 적용하지 못했습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!