有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java BuffereImage不是从0,0开始绘制的

我希望我的第一篇帖子对你们来说不是太基本

我正在尝试使用BuffereImage(使用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) 个答案

  1. # 1 楼答案

    一般问题

    • 不要扩展JFrame(尤其是不要重写JFramepaint方法)。相反,在paintComponent方法中绘制扩展JPanel的类
    • 从事件分派线程创建GUI

    产生意外结果的主要原因是,您正在创建一个具有框架大小的图像,但框架也有一个标题栏和一个边框,这些都是图像的“覆盖”部分。实际可用于绘制的区域的大小小于总框架大小。此外,只要帧在屏幕上还不可见,getWidth()getHeight()方法可能会返回垃圾

    考虑到所有这些因素的一种方法可能在这段代码中是这样的:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.image.BufferedImage;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class Mandelbrot 
    {
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    createAndShowGUI();
                }
            });
        }
    
        private static void createAndShowGUI()
        {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setLayout(new GridLayout(1, 1));
    
            BufferedImage image = createImage(500, 500);
            ImagePanel imagePanel = new ImagePanel(image);
            frame.getContentPane().add(imagePanel);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        private static BufferedImage createImage(int w, int h)
        {
            BufferedImage image = new BufferedImage(w, h,
                BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < w; x++)
            {
                image.setRGB(x, x, Color.GREEN.getRGB());
            }
            return image;
        }
    
        static class ImagePanel extends JPanel
        {
            private final BufferedImage image;
    
            ImagePanel(BufferedImage image)
            {
                this.image = image;
            }
    
            @Override
            public Dimension getPreferredSize()
            {
                if (super.isPreferredSizeSet())
                {
                    return super.getPreferredSize();
                }
                return new Dimension(image.getWidth(), image.getHeight());
            }
    
            @Override
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, null);
            }
        }
    
    }
    
  2. # 2 楼答案

    所有BuffereImage对象的左上角坐标均为(0,0)。因此,用于构建BuffereImage的任何光栅必须具有minX=0和minY=0

    这就是你的问题所在

    JavaDoc for BufferedImage

    编辑:

    同时从循环中删除以下内容:

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