将灰度值从.csv转换为BufferedImage

时间:2017-12-08 17:26:00

标签: java png bufferedimage javax.imageio

我尝试使用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格式,并且无法找到产生此错误的内容。

2 个答案:

答案 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中的数据位置和缓存。在您的情况下,它主要是因为您只需要计算(舍入,转换)每行的值。