我正在使用 Graphics2D 類來覆寫兩個影像(我希望一個作為背景,另一個較小的出現在頂部),然后我想添加一行簡單的文本。這段代碼效果很好,但我從 for 回圈中呼叫它,在生成第一個影像后,其余的文本開始變得奇怪。我正在列印數字,就像程式在最后一個影像中的文本上插入新文本一樣,依此類推。
這是我從 for 回圈呼叫以創建影像的函式:
private static void createCompositeImage(BufferedImage image, BufferedImage overlay, String filename, String codigo) throws IOException {
Graphics2D g = image.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
g.drawImage(overlay, (image.getWidth() - overlay.getWidth()),
(image.getHeight() - overlay.getHeight())-200, null);
g.setFont(g.getFont().deriveFont(40f));
g.drawString("Entrada número: " codigo, 30, image.getHeight()-300);
g.dispose();
ImageIO.write(image, "jpeg", new File(filename ".jpeg"));
}
這就是任何非第一張影像所發生的情況:

有誰知道我做錯了什么?
uj5u.com熱心網友回復:
繪畫圖形很像在現實世界的畫布上繪畫,您只是在已經存在的東西的頂部繪畫。如果要“替換”影像的一部分,則需要先在其頂部進行繪畫。
在這種情況下...
你可以...
在文本將被繪制到的區域上用默認顏色填充矩形。
這是有問題的,因為您需要知道覆寫的“最大”可能區域或之前繪制的內容的大小。
或者...
你可以...
從每個周期的空白石板開始。也就是說,從每個周期的“主”影像的副本開始,然后簡單地將狀態重新繪制到其中。
例如...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public class TestPane extends JPanel {
private BufferedImage master;
private BufferedImage background;
private Timer timer;
private DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss a");
public TestPane() throws IOException {
master = ImageIO.read(getClass().getResource("/images/background.jpg"));
background = new BufferedImage(master.getWidth(), master.getHeight(), BufferedImage.TYPE_INT_ARGB);
renderBackground();
}
protected void renderBackground() {
if (master == null) {
return;
}
Graphics2D g2d = background.createGraphics();
g2d.drawImage(master, 0, 0, this);
g2d.setFont(getFont());
FontMetrics fm = g2d.getFontMetrics();
String time = LocalTime.now().format(timeFormatter);
int x = (background.getWidth() - fm.stringWidth(time)) / 2;
int y = ((background.getHeight() - fm.getHeight()) / 2) fm.getAscent();
g2d.drawString(time, x, y);
g2d.dispose();
repaint();
}
@Override
public Dimension getPreferredSize() {
if (master == null) {
return new Dimension(200, 200);
}
return new Dimension(master.getWidth(), master.getHeight());
}
@Override
public void addNotify() {
super.addNotify();
if (timer != null) {
timer.stop();
}
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
renderBackground();
}
});
timer.start();
}
@Override
public void removeNotify() {
super.removeNotify();
if (timer != null) {
timer.stop();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (background == null) {
return;
}
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - background.getWidth()) / 2;
int y = (getHeight() - background.getHeight()) / 2;
g2d.drawImage(background, x, y, this);
g2d.dispose();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/334608.html
