Rumah >Java >javaTutorial >Bagaimana untuk Mengindih Teks dengan Betul pada BufferedImage menggunakan Graphics2D Java?
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!