从RGB像素值创建缓冲图像

5

我有一个整数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值正确初始化图像?

编辑: 这是我的图像样子alt text

谢谢, Jeff


setDataElements(...)对我来说运行良好。 您的int值可能有误。 发布您的SSCCE以演示问题。 - camickr
@camickr,我认为你是对的,我的底层像素值可能是错误的。我会再仔细研究一下,然后回复。 - Jeff Storey
1
这看起来像是数据对齐出了问题。你的像素是32位整数,但整数RGB格式只有24位。你应该尝试创建一个包含3个字节的像素结构体,并传递一个该类型的数组。 - Hannesh
可能是重复的问题:int数组转换为BufferedImage - Harald K
3个回答

4
尝试使用 setDataElements 替代 setPixels
另一个选择是让图像共享数组,而不是从中复制(请参见此答案的示例)。

+1,很酷,我学会了setDataElements和setPixels之间的区别。 - camickr
我尝试了setDataElements,但仍然遇到同样的问题。我已经添加了一张图片来展示我所看到的内容。也许它会给出一些提示,说明可能是什么原因导致的。 - Jeff Storey

1

不确定如何使用单个数组值来完成。我相信当您使用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 );
    }
}

1
TYPE_INT_RGB使用每个像素一个int;OP指定int[]的每个元素具有RGB值。 - Michael Brewer-Davis
@MIchael Brewer-Davis,你可能会认为TYPE_INT_RGB每个像素单元使用一个int,但是当使用setPixel(...)方法时似乎并非如此,这就是为什么会有这个问题的原因。我提供了一个解决方案,展示了如何使用setPixel(...)方法。话虽如此,最好的答案是使用setDataElements(...)方法。 - camickr

-1
无法得到正确的图像的原因是那些像素包括了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 是每个像素的位置,row 与 col 相同,1,1 是每个像素的大小。


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