我在使用 Graphics2D 在 JPanel 上渲染的自定义绘制图像时遇到问题。如果我尝试使用
fillRect
为面板的每个 x/y 宽度和长度绘制 1x1 像素,它将在图案中创建一堆不同大小的 1x1、1x2 和 2x2 矩形。我尝试过使用 Graphics2D 渲染提示,但无法弄清楚是什么导致了这种情况发生。
这是所发生情况的放大视图,矩形大小似乎也创建了一个图案。
这是一个最小可行的示例,应该打印 1x1 矩形。
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
class Scratch {
public static final int WIDTH = 400;
public static final int HEIGHT = 400;
public static void main(String[] args) {
BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = img.createGraphics();
JPanel panel = new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D panel2d = (Graphics2D) g;
// Black bg
g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, getWidth(), getHeight());
int c = 0;
for (int x = 0; x < getWidth(); x++) {
for (int y = 0; y < getHeight(); y++) {
g2d.setColor(new Color((c += 13) % 255, (c += 17) % 255, (c += 23) % 255));
g2d.fillRect(x, y, 1, 1);
}
}
panel2d.drawImage(img, null, 0, 0);
}
};
JFrame frame = new JFrame("Scratch");
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
frame.getContentPane().setPreferredSize(new Dimension(WIDTH, HEIGHT));
frame.pack();
}
}
或者我应该使用 Graphics2D 以外的其他东西来做到这一点?
我不认为问题在于它创建了不同大小的矩形,而是创建了多个相同颜色的矩形。这意味着您的颜色功能可能是问题的原因。如果您的目标是让颜色从黑色过渡到白色,然后跳到黄色和红色(看起来就是这样),您可以测试 R、G 和 B 值的统一值,如下所示:
g2d.setColor(new Color((c += 15) % 255, (c += 15) % 255, (c += 15) % 255));
您可以不断更改递增的值以获得不同的模式。 如果可能的话,您可以发送您正在尝试创建的图案吗?