Создать буферизованное изображение из значений пикселей RGB - PullRequest
5 голосов
/ 06 января 2011

У меня есть целочисленный массив пикселей RGB, который выглядит примерно так:

pixels[0] = <rgb-value of pixel(0,0)>
pixels[1] = <rgb-value of pixel(1,0)>
pixels[2] = <rgb-value of pixel(2,0)>
pixels[3] = <rgb-value of pixel(0,1)>
...etc...

И я пытаюсь создать из него BufferedImage. Я попробовал следующее:

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
img.getRaster().setPixels(0, 0, width, height, pixels);

Но полученное изображение имеет проблемы с цветными полосами. Изображение нечеткое, через него проходят диагональные и горизонтальные линии.

Как правильно инициализировать изображение значениями rgb?

EDIT: Вот как выглядит мое изображение alt text

спасибо, Джефф

Ответы [ 3 ]

3 голосов
/ 06 января 2011

Попробуйте <a href="http://download.oracle.com/javase/6/docs/api/java/awt/image/WritableRaster.html#setDataElements%28int,%20int,%20int,%20int,%20java.lang.Object%29" rel="nofollow noreferrer">setDataElements</a> вместо setPixels.

Другой вариант для изображения - использовать массив вместо его копирования (см. этот ответ для примера.)

1 голос
/ 06 января 2011

Не уверен, как это сделать с одним значением массива. Я считаю, что вам нужно три значения массива для указания цвета при использовании TYPE_INT_RGB:

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class ImageFromArray2 extends JFrame
{
    int width = 50;
    int height = 50;
    int imageSize = width * height;

    public ImageFromArray2()
    {
        JPanel panel = new JPanel();
        getContentPane().add( panel );
        int[] pixels = new int[imageSize * 3];

        //  Create Red Image

        for (int i = 0; i < imageSize * 3; i += 3)
        {
            pixels[i] = 255;
            pixels[i+1] = 0;
            pixels[i+2] = 0;
        }

        panel.add( createImageLabel(pixels) );

        //  Create Green Image

        for (int i = 0; i < imageSize * 3; i += 3)
        {
            pixels[i] = 0;
            pixels[i+1] = 255;
            pixels[i+2] = 0;
        }

        panel.add( createImageLabel(pixels) );

        //  Create Blue Image

        for (int i = 0; i < imageSize * 3; i += 3)
        {
            pixels[i] = 0;
            pixels[i+1] = 0;
            pixels[i+2] = 255;
        }

        panel.add( createImageLabel(pixels) );

        //  Create Cyan Image

        for (int i = 0; i < imageSize * 3; i += 3)
        {
            pixels[i] = 0;
            pixels[i+1] = 255;
            pixels[i+2] = 255;
        }

        panel.add( createImageLabel(pixels) );

    }

    private JLabel createImageLabel(int[] pixels)
    {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        WritableRaster raster = image.getRaster();
        raster.setPixels(0, 0, width, height, pixels);
        JLabel label = new JLabel( new ImageIcon(image) );
        return label;
    }

    public static void main(String args[])
    {
        JFrame frame = new ImageFromArray2();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }
}
0 голосов
/ 08 февраля 2013

Причина, по которой вы не можете получить правильное изображение, состоит в том, что эти пиксели включают цвета rgb, чтобы правильно настроить каждый пиксель, который вы чаще всего делаете следующим

double[] pixelsArr=new double[4];
pixelsArr[0]=(Integer.parseInt(string2.trim())>>16) & 0xFF;
pixelsArr[1]=(Integer.parseInt(string2.trim())>>8) & 0xFF;
pixelsArr[2]=(Integer.parseInt(string2.trim())) & 0xFF;
pixelsArr[3]=0xFF;
img.getRaster().setPixels(col,row,1,1, pixelsArr);

string2 - это целое число, col - это позициякаждого пикселя и строки одинаковы, а 1,1 - размер каждого пикселя.

...