【问题标题】:Using BufferedImage to create an image in Java使用 BufferedImage 在 Java 中创建图像
【发布时间】:2014-03-04 15:32:45
【问题描述】:

我正在尝试使用 BufferedImage 中的 setRGB() 方法使用给定的 2D 像素数组(行和列)重新创建图像。

下面是代码:

BufferedImage bufferedImage = new BufferedImage(reconstructedJPEG[0].length, reconstructedJPEG.length, BufferedImage.TYPE_INT_RGB);
//loop through redPixels[][] array
for(int row=0; row<redPixels.length; row++){
    for(int col=0; col<redPixels[0].length; col++){
        //call setRGB() on redPixels
        bufferedImage.setRGB(col, row, (redPixels[row][col]));
    }
}

上面的代码有效,但我不确定如何设置绿色和蓝色像素阵列? 现在,它是一张非常暗淡的深红色/紫色图像,看起来不像原始图像。

另外,我可以将这些数组形成一维图像(将其原始像素、红+绿+蓝分量合并为一个整数?

感谢任何帮助都会很棒。

【问题讨论】:

    标签: java arrays rgb bufferedimage


    【解决方案1】:

    使用位运算符将 3 个通道(红色、绿色和蓝色)的各个颜色值组合到一个像素中:

    int rgb = (redValue & 0xff) << 16 | (greenValue & 0xff) << 8 | (blueValue & 0xff);
    

    然后以组合值作为参数调用setRGB

    bufferedImage.setRGB(col, row, rgb);
    

    按位运算语句乍一看可能很麻烦,但它做了以下事情:

    • 使用 &amp; 0xff 掩码获取每个通道值并使其成为基于 8 位范围的值 (0, 255)(BufferedImage.TYPE_INT_RGB 格式要求通道为 8 位值)

      redValue &amp; 0xff, greenValue &amp; 0xff, blueValue &amp; 0xff

    • 使用以下布局将通道值打包成一个 32 位整数:

    【讨论】:

    • 感谢您的回复。我最初像这样分割像素: rgbPixels[j][0] = ((rawPixels[j]>>16)&0xff); rgbPixels[j][1] = ((rawPixels[j]>>8)&0xff); rgbPixels[j][2] = (rawPixels[j]&0xff); rgbPixels[j][3] = ((rawPixels[j]>>24)&0xff);我应该省略 alpha 值吗?
    • 是的,这种格式的 alpha 通道应该是空的(实际上被忽略了)。
    • 感谢您的回复。由于某种原因,我得到的图像完全被打乱了。我认为这可能是因为我最初接受了 alpha 值,但没有做任何事情,现在我使用 3 RGB 值只是为了再次形成图像。我应该如何处理其他数组集(我必须创建一个 alpha 数组)?谢谢
    • 除非我可以改变初始操作,并且不接受那个 alpha 值。谢谢
    • 尝试忽略 alpha 并使用:rgbPixels[j][0] &lt;&lt; 16 | rgbPixels[j][1] &lt;&lt; 8 | rgbPixels[j][2] only
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多