java - 为什么 raster.setPixels() 返回灰度图像

标签 java image bufferedimage

这里我尝试用最快的方法将 3 个矩阵(R、G 和 B)保存到 BufferedImage 中。

我在 StackExchange 上找到了这个方法,但它对我不起作用,因为它以灰度颜色保存图像。

如果我做错了什么,或者有比 bufferimage.setRGB() 更快的方法,请帮助我。谢谢!

public static BufferedImage array_rasterToBuffer(int[][] imgR,
         int[][]imgG, int[][] imgB) {

    final int width = imgR[0].length;
    final int height = imgR.length;
    int numBandas = 3;
    int[] pixels = new int[width*height*numBandas];
    int cont=0;
    System.out.println("max: "+width*height*3);
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            for (int band = 0; band < numBandas; band++) {
                pixels[(((i*width)+j)*numBandas +band)] =Math.abs((  (imgR[i][j] & 0xff) >> 16 | (imgG[i][j] & 0xff) >> 8 | (imgB[i][j] & 0xff)));
                cont+=1;
            }
        }
    }


    BufferedImage bufferImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);

    WritableRaster rast = (WritableRaster) bufferImg.getData(); 
    rast.setPixels(0, 0, width, height, pixels);
    bufferImg.setData(rast);

    return bufferImg;
}

最佳答案

我认为你变得灰暗是因为表达

Math.abs((  (imgR[i][j] & 0xff) >> 16 | (imgG[i][j] & 0xff) >> 8 | (imgB[i][j] & 0xff)));

不依赖于band ,所以你的 RGB 值都是相同的。

无论如何,该表达式看起来很可疑,因为您通常使用左移运算符 <<将 RGB 值打包到单个 int 时.

我不确定,因为我不熟悉您正在使用的类,但我猜这样的东西可能会起作用

for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
        pixels[(((i*width)+j)*numBandas)]     = imgR[i][j] & 0xFF;
        pixels[(((i*width)+j)*numBandas + 1)] = imgG[i][j] & 0xFF;
        pixels[(((i*width)+j)*numBandas + 2)] = imgB[i][j] & 0xFF;
    }
}

关于java - 为什么 raster.setPixels() 返回灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33550852/

相关文章:

java - 里氏替换原则 - 我在这里违反了它吗?

java - 初始化相互依赖的对象时的最佳做法是什么?

python - Python 中的 PIL 提示 PixelAccess 没有 'size' 属性,我做错了什么?

android - 如何仅从 Google Photos 应用程序中选择图像? Android 谷歌相册 Intent

java - 灰度图像未使用 BufferedImage.TYPE_USHORT_GRAY 保存

java - Maven、Jar 不包含 MAIN 项目 jar

java - 按回车键时停止 Linux 终端换行

python - 如何检测所有矩形框python opencv而不会遗漏任何东西

javafx - JavaFx 上 BufferedImage (java awt) 的等效项

java - Swing : change the icon of jframe