Rumah >Java >javaTutorial >Bagaimana untuk Mengindih Teks dengan Betul pada BufferedImage menggunakan Graphics2D Java?

Bagaimana untuk Mengindih Teks dengan Betul pada BufferedImage menggunakan Graphics2D Java?

Patricia Arquette
Patricia Arquetteasal
2024-11-29 06:34:14341semak imbas

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

Menggunakan Graphics2D untuk Mengindih Teks pada BufferedImage dan Mengembalikan Imej Buffered

Dalam contoh ini, kami menunjukkan cara untuk menindih teks pada BufferedImage menggunakan Graphics2D. Kami berhasrat untuk menyediakan penyelesaian untuk memaparkan teks terus ke imej dan mengembalikan BufferedImage yang diubah suai.

Kod Awal dan Percanggahan:

Coretan kod yang disediakan cuba dicapai tindanan teks tetapi gagal membuat sebarang perubahan yang boleh dilihat pada imej.

Isu:

Isunya terletak pada cara kaedah drawString() mentafsir koordinat x dan y. Koordinat ini menunjukkan kedudukan garis dasar aksara pertama, bukan sudut kiri atas teks. Oleh itu, bergantung pada fon dan kehadiran turunan (aksara seperti "g" atau "p"), teks mungkin berakhir di luar sempadan imej.

Penyelesaian:

Untuk menangani perkara ini, kita perlu melaraskan kedudukan teks. Daripada menggunakan x dan y secara langsung, kami mula-mula mendapatkan FontMetrics untuk objek Font semasa. FontMetrics membolehkan kami mengira offset yang diperlukan untuk meletakkan teks dengan betul.

Secara khusus, kami mengira offset mendatar untuk memastikan teks dipusatkan dalam lebar yang tersedia dan kami melaraskan offset menegak untuk mengelakkan pemotongan teks.

Kod Ditulis Semula dengan Contoh:

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

Dalam kod yang diubah suai ini, kami mengira offset dengan betul berdasarkan metrik fon dan memaparkan teks dengan sewajarnya. Akibatnya, teks tindanan akan diletakkan dengan betul dalam imej.

Atas ialah kandungan terperinci Bagaimana untuk Mengindih Teks dengan Betul pada BufferedImage menggunakan Graphics2D Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn