Рисование пикселей изображения на Java - PullRequest
7 голосов
/ 13 августа 2011

Какой метод является лучшим способом для создания пиксельного изображения с Java. Скажем, я хочу создать пиксельное изображение с размерами 200x200, что в сумме составляет 40.000 пикселей. Как я могу создать пиксель из случайного цвета и визуализировать его в заданной позиции на JFrame.

Я попытался создать собственный компонент, который просто создает пиксель, но кажется, что это не очень эффективно, если я создаю такой пиксель 250.000 раз с помощью цикла for и добавляю каждый экземпляр в макет JPanels.

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

Ответы [ 3 ]

9 голосов
/ 13 августа 2011

Вам не нужно создавать класс для этого.У 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
6 голосов
/ 13 августа 2011

Ключ здесь - класс 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);
    }
}

Сгенерированное изображение выглядит так:

Noise Image

3 голосов
/ 13 августа 2011

Возможно, вы захотите создать BufferedImage нужного вам размера и использовать img.setRGB(x, y, getRandomColor()) для создания группы случайных пикселей. Тогда вы можете рендерить все изображение в любом месте.

...