我需要将灰度图像的像素强度数据的2D数组转换回图像。我试过这个:
BufferedImage img = new BufferedImage(
regen.length, regen[0].length, BufferedImage.TYPE_BYTE_GRAY);
for(int x = 0; x < regen.length; x++){
for(int y = 0; y<regen[x].length; y++){
img.setRGB(x, y, (int)Math.round(regen[x][y]));
}
}
File imageFile = new File("D:\\img\\conv.bmp");
ImageIO.write(img, "bmp", imageFile);
其中“regen”是2D双数组。我得到一个相似但不完全的输出。有几个像素与它必须完全相反(我得到一个值为255的像素的黑色)。很少有灰色阴影也被视为白色。你能告诉我我在做什么错吗?
答案 0 :(得分:2)
尝试这样的代码:
public void writeImage(int Name) {
String path = "res/world/PNGLevel_" + Name + ".png";
BufferedImage image = new BufferedImage(color.length, color[0].length, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < 200; x++) {
for (int y = 0; y < 200; y++) {
image.setRGB(x, y, color[x][y]);
}
}
File ImageFile = new File(path);
try {
ImageIO.write(image, "png", ImageFile);
} catch (IOException e) {
e.printStackTrace();
}
}
答案 1 :(得分:1)
BufferedImage.TYPE_BYTE_GRAY
是未签名且未编入索引的。此外,
当具有非不透明alpha的数据存储在此类型的图像中时,必须将颜色数据调整为非预乘形式并丢弃alpha,如
AlphaComposite
文档中所述。
至少需要排除符号扩展并屏蔽除第三个参数的最低8位以外的所有位setRGB()
。重现问题的样本数据将是决定性的。