将灰度值从 .csv 转换为 BufferedImage
Converting Grayscale values from .csv to BufferedImage
我正在尝试使用 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
的替代方案,但没有成功,也尝试了输出的 png 格式,但找不到导致此错误的原因。
应该是
int g = (int)Math.round(pixArray[y]);
image.setRGB(x,y,new Color(g,g,g).getRGB());
您当前的代码所做的是将 alpha 设置为像素值,但将颜色分量全部保留为零。
发布替代解决方案。虽然吉姆的答案是正确的并且有效,但它也是将样本值放入灰度的最慢*方法之一 BufferedImage
。
A BufferedImage
和 TYPE_BYTE_GRAY
不需要所有 RGB 颜色之间的转换。要将灰度值直接放入图像中,请通过图像的光栅进行:
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);
}
}
*) 速度慢是因为创建了过多的一次性 Color
实例,但主要是由于颜色 space 转换 to/from sRGB 颜色 space。在 100x100 的图像中可能不太明显,但如果您尝试使用 1000x1000 或更大的图像,您会注意到。
PS:我还重新安排了循环以在内部循环中遍历 x。由于现代 CPU 中的数据局部性和缓存,这通常会更快,尤其是在读取值时。在您的情况下,这主要是因为您只需要计算(舍入,转换)每一行的值。
我正在尝试使用 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
的替代方案,但没有成功,也尝试了输出的 png 格式,但找不到导致此错误的原因。
应该是
int g = (int)Math.round(pixArray[y]);
image.setRGB(x,y,new Color(g,g,g).getRGB());
您当前的代码所做的是将 alpha 设置为像素值,但将颜色分量全部保留为零。
发布替代解决方案。虽然吉姆的答案是正确的并且有效,但它也是将样本值放入灰度的最慢*方法之一 BufferedImage
。
A BufferedImage
和 TYPE_BYTE_GRAY
不需要所有 RGB 颜色之间的转换。要将灰度值直接放入图像中,请通过图像的光栅进行:
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);
}
}
*) 速度慢是因为创建了过多的一次性 Color
实例,但主要是由于颜色 space 转换 to/from sRGB 颜色 space。在 100x100 的图像中可能不太明显,但如果您尝试使用 1000x1000 或更大的图像,您会注意到。
PS:我还重新安排了循环以在内部循环中遍历 x。由于现代 CPU 中的数据局部性和缓存,这通常会更快,尤其是在读取值时。在您的情况下,这主要是因为您只需要计算(舍入,转换)每一行的值。