开发者

Create a buffered image from rgb pixel values

开发者 https://www.devze.com 2023-02-02 16:15 出处:网络
I have an integer array of RGB pixels that looks something like: pixels[0] = <rgb-value of pixel(0,0)>

I have an integer array of RGB pixels that looks something like:

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...

And I'm trying to create a BufferedImage from it. I tried the following:

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

But the resulting image has problems with the color bands. The image is unclear a开发者_StackOverflow社区nd there are diagonal and horizontal lines through it.

What is the proper way to initialize the image with the rgb values?

EDIT: Here is what my image looks like

Create a buffered image from rgb pixel values

thanks, Jeff


Try setDataElements instead of setPixels.

Another option is for the image to share the array instead of copying from it (see this answer for an example.)


Not sure how to do it with a single array value. I believe you need three array values to specify the color when you use 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 );
    }
}


The reason you cant get the correct image is that those pixels include the rgb colors, in order to set well each pix you most do the next

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 is an integer pixel col is the position of each pix and row the same, and 1,1 is the size of each pixel.

0

精彩评论

暂无评论...
验证码 换一张
取 消