我尝试使用BufferedImage将包含灰度值的.csv文件转换为图像。
最初将csv读入pixArray[]
,其中所有值都是双倍的。
我正在尝试使用BufferedImage创建一个带代码
的100x100px输出图像 BufferedImage image = new BufferedImage(width,height,BufferedImage.
TYPE_BYTE_GRAY);
for(int x = 0; x < width; x++)
{
for(int y = 0; y < height; y++)
{
image.setRGB(x, y, (int)Math.round(pixArray[y]));
}
}
File file_out = new File("output.png");
try {
ImageIO.write(image, "png", file_out);
} catch (IOException e) {
e.printStackTrace();
}
但我输出的只是100x100黑色方块。
我已经尝试了TYPE_BYTE_GRAY
的替代方案但没有成功,以及outout的png格式,并且无法找到产生此错误的内容。
答案 0 :(得分:1)
应该是
int g = (int)Math.round(pixArray[y]);
image.setRGB(x,y,new Color(g,g,g).getRGB());
您当前的代码正在做的是将alpha设置为像素值,但将颜色分量保持为零。
答案 1 :(得分:0)
发布替代解决方案。虽然Jim的答案是正确且有效的,但它也是将样本值放入灰度BufferedImage
的最慢*方法之一。
带有BufferedImage
的{{1}}不需要与RGB颜色进行所有转换。要将灰度值直接放入图像中,请通过图像的栅格执行:
TYPE_BYTE_GRAY
*)由于创建过多的丢弃BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster = image.getRaster();
for (int y = 0; y < height; y++) {
int value = (int) Math.round(pixArray[y])
for (int x = 0; x < width; x++) {
raster.setSample(x, y, 0, value);
}
}
实例而缓慢,但主要是由于色彩空间转换为/从sRGB色彩空间转换。在100x100图像中可能不太明显,但如果您尝试1000x1000或更大,您会注意到。
PS:我还重新安排了循环以在内循环中循环x。这通常更快,特别是在读取值时,由于现代CPU中的数据位置和缓存。在您的情况下,它主要是因为您只需要计算(舍入,转换)每行的值。