【问题标题】:Painting pixels images in Java在 Java 中绘制像素图像
【发布时间】:2011-10-26 05:45:28
【问题描述】:

哪种方法是用java创建像素图像的最佳方法。 说,我想创建一个尺寸为 200x200 的像素图像,总共 40.000 像素。如何从随机颜色创建像素并将其渲染到 JFrame 上的给定位置。

我尝试创建一个只创建像素的自己的组件,但如果我使用 for 循环创建这样的像素 250.000 次并将每个实例添加到 JPanels 布局中,这似乎不是很高效。

class Pixel extends JComponent {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(getRandomColor());
        g.fillRect(0, 0, 1, 1);
    }
}

【问题讨论】:

    标签: java swing pixel graphics2d paintcomponent


    【解决方案1】:

    这里的关键是Canvas 类。它是允许任意绘制操作的标准Component。为了使用它,您必须继承 Canvas 类并覆盖 paint(Graphics g) 方法,然后循环遍历每个像素并绘制随机颜色。以下代码应该可以工作:

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.Random;
    
    import javax.swing.JFrame;
    
    public class PixelCanvas extends Canvas {
        private static final int WIDTH = 400;
        private static final int HEIGHT = 400;
        private static final Random random = new Random();
    
        @Override
        public void paint(Graphics g) {
            super.paint(g);
    
            for(int x = 0; x < WIDTH; x++) {
                for(int y = 0; y < HEIGHT; y++) {
                    g.setColor(randomColor());
                    g.drawLine(x, y, x, y);
                }
            }
        }
    
        private Color randomColor() {
            return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));
        }
    
        public static void main(String[] args) {
            JFrame frame = new JFrame();
    
            frame.setSize(WIDTH, HEIGHT);
            frame.add(new PixelCanvas());
    
            frame.setVisible(true);
        }
    }
    

    生成的图像如下所示:

    【讨论】:

    • 小心混用CanvasJFrame;也可以考虑new Color(random.nextInt(), true)
    • 同样可以通过实例化 Frame 而不是 JFrame 来避免奇怪的混合。
    • 不过,当您已经知道只需要一个像素时,调用 drawLine 听起来有点过头了。
    【解决方案2】:

    您不需要为此创建一个类。 Java 已经拥有出色的 BufferedImage 类,可以满足您的需求。这是一些伪代码:

    int w = 10;
    int h = 10;
    int type = BufferedImage.TYPE_INT_ARGB;
    
    BufferedImage image = new BufferedImage(w, h, type);
    
    int color = 255; // RGBA value, each component in a byte
    
    for(int x = 0; x < w; x++) {
        for(int y = 0; y < h; y++) {
            image.setRGB(x, y, color);
        }
    }
    
    // Do something with image
    

    【讨论】:

    • 1:1,尝试将其放在摆动窗格上时不起作用。使用与来自ImageIO.read() 的图像相同的代码,它确实如此。所以这里的代码有问题,虽然我不确定是什么
    【解决方案3】:

    您可能想要创建一个您想要大小的BufferedImage,并使用img.setRGB(x, y, getRandomColor()) 创建一堆随机像素。然后你可以在任何你想要的地方渲染整个图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2013-10-09
      相关资源
      最近更新 更多