【问题标题】:Java: save grayscale int array to imageJava:将灰度 int 数组保存到图像
【发布时间】:2016-06-05 14:15:23
【问题描述】:

我目前有一个从 0 ... 255 的灰度值的简单 int[] 数组。我想将这些值保存到一个简单的图像文件中。我执行以下操作:

// flatten the 2d array
int[] result = Arrays.stream(imgData)
    .flatMapToInt(Arrays::stream)
    .toArray();

BufferedImage outputImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
outputImage.setRGB(0, 0, w, h, result, 0, w);
ImageIO.write(outputImage, INPUT_FILETYPE, new File(getOutputFileSystemString()));

这实际上效果很好,但是图像很暗,比我认为的要暗。

这是 IrfanView 中的输出图像。你实际上可以看到细节,它不是全黑的,而是极其黑暗的。我将左上角的每个像素都设置为 255,但它仍然非常暗,但你至少可以看到我认为应该是白色的轮廓:

有人知道为什么吗?

【问题讨论】:

  • imgData 的类型是什么?二维 int[]?
  • @ManoDestra 是的。它包含从 0 到 255 的 int 值,大小正好是 int[1024][1024]。
  • 您创建了一个名为result 的数组,但随后在函数调用中使用了source
  • 啊,是的,这实际上是我的复制错误,因为我正在测试将原始灰度图像放入数组中,但结果仍然相同。很黑...应该是result,我编辑了。
  • 如果您使用的是 Java 8,那么您不妨看看 ColorAdjust 类。

标签: java image


【解决方案1】:

我相信您使用WritableRaster 会有更好的运气:

BufferedImage outputImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster = outputImage.getRaster();
raster.setSamples(0, 0, w, h, 0, result);
ImageIO.write(outputImage, INPUT_FILETYPE, new File(getOutputFileSystemString()));

【讨论】:

    【解决方案2】:

    您可以使用 WritableRaster(忘记 getRGB,这是访问像素的最糟糕方式):

    int[] myarray = ...
    WritableRaster wr = image.getRaster() ;
    for (int y=0, nb=0 ; y < image.getHeight() ; y++)
        for (int x=0 ; x < image.getWidth() ; x++, nb++)
            wr.setSample(x, y, 0, myarray[nb]) ;
    

    使用 DataBuffer 更快,但是你必须处理图像编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-07
      • 2020-12-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多