在Java中绘制像素图像

8
哪种方法是使用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);
    }
}
3个回答

11

你不需要为此创建一个类。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,在尝试将其放置在Swing面板上时无法工作。使用来自ImageIO.read()的图像相同的代码,它可以正常工作。因此,这里的代码有问题,尽管我不确定是什么问题。 - phil294

6

关键在于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);
    }
}

生成的图片如下所示:

噪音图像


1
小心混合使用 CanvasJFrame;同时考虑使用 new Color(random.nextInt(), true) - trashgod
可以通过实例化 Frame 而不是 JFrame 来避免奇怪的混合效果,从而达到相同的效果。 - Xavi Montero
然而,当你已经知道你只需要一个像素时,调用“drawLine”似乎有点大材小用。 - Roland Illig

3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接