> Java > java지도 시간 > Java의 Graphics2D를 사용하여 BufferedImage에 텍스트를 올바르게 오버레이하는 방법은 무엇입니까?

Java의 Graphics2D를 사용하여 BufferedImage에 텍스트를 올바르게 오버레이하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-29 06:34:14
원래의
357명이 탐색했습니다.

How to Correctly Overlay Text onto a BufferedImage using Java's Graphics2D?

Graphics2D를 사용하여 버퍼링된 이미지에 텍스트를 오버레이하고 버퍼링된 이미지를 반환

이 예에서는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿