gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:00:38 25 4
gpt4 key购买 nike

这里我尝试用最快的方法将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com