BufferedImage不从0,0绘制

时间:2014-03-30 18:52:19

标签: java image swing jframe paint

我希望我的第一篇文章对于所有人来说都不是太基础。

我尝试使用BufferedImage(使用setRGB())在JCanvas上进行每像素绘制。我以为我会测试所有正在使用从原点到JCanvas的宽度/高度的单个对角线。麻烦的是我在x轴上得到一个奇怪的偏移,我似乎无法修复!

这是问题的链接: http://i811.photobucket.com/albums/zz31/bohngy/problemMandel_zpsae20713a.jpeg

enter image description here

以下是代码:

public class Mandelbrot extends JFrame {

private BufferedImage I;

public Mandelbrot() {
    super("Mandelbrot Set");
    setSize(600, 600);
    setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
    for (int x = 0; x < getHeight(); x++) {
        for (int y = 0; y < getWidth(); y++) {
            I.setRGB(x, x, Color.GREEN.getRGB());
        }
    }
}

@Override
public void paint(Graphics g) {
    g.drawImage(I, 0, 0, this);
}

public static void main(String[] args) {
    new Mandelbrot().setVisible(true);
  }
}

2 个答案:

答案 0 :(得分:3)

一般问题

  • 不要延长JFrame(特别是,不要覆盖paint的{​​{1}}方法。相反,在JFrame方法中绘制一个扩展paintComponent
  • 的类
  • 从事件调度线程
  • 创建GUI

出现意外结果的主要原因是您正在创建一个具有框架大小的图像 - 但框架还有一个标题栏和一个边框,这些是&#34;覆盖&#34;部分图像。实际可用于绘画的区域大小小于总帧大小。此外,只要框架在屏幕上尚未显示,JPanelgetWidth()方法可能会返回垃圾。

考虑所有这些的一种方法可能就像在这个片段中一样:

getHeight()

答案 1 :(得分:0)

所有BufferedImage对象的左上角坐标为(0,0)。因此,用于构造BufferedImage的任何Raster必须具有minX = 0和minY = 0。

这就是你的问题。

BufferedImage

的JavaDoc

编辑:

同样从循环中删除它:

for (int y = 0; y < getWidth(); y++) {
    I.setRGB(x, x, Color.GREEN.getRGB());
}