【问题标题】:Set Raster Data with Byte Array使用字节数组设置栅格数据
【发布时间】:2016-12-20 19:26:21
【问题描述】:

我对 BufferedImage 中的栅格有疑问。我有一个图像数据的字节数组,我想将该字节数据设置为新的图像数据。我已经看到了这样做的方法,如下图所示:

   BufferedImage bImageFromConvert = new BufferedImage(dimWidth, dimHeight, BufferedImage.TYPE_BYTE_GRAY);
   byte[] bufferHolder = ((DataBufferByte) bImageFromConvert.getRaster().getDataBuffer()).getData();
   System.arraycopy(imageInByte, 0, bufferHolder, 0, bufferHolder.length);//imageInByte is my byte array  
   ImageIO.write(bImageFromConvert, "bmp", new File(
                directory + fileName + "_Compressed.bmp"));

但是,在将数据写入 bmp 时,最终结果并非预期的那样。几天来,我一直在苦苦琢磨这个项目,我想看看是否可以将字节数据直接放入 Raster 中,看看是否会有所作为。如果这个问题有点令人困惑,我很抱歉,我的大脑因编码时间而有点煎熬。请让我知道是否有任何方法可以使其更清楚。

谢谢!

编辑:输出图像 clilck

EDIT2:旁注,有谁知道为什么字节似乎在输出图像中重复?区分高位和低位的代码似乎没有重复任何内容。

【问题讨论】:

  • 您得到的结果有哪些与您的预期不同?
  • 您是否尝试将字节数组imageInByte 应用于bImageFromConvert
  • @CraigR8806 我正在将堆叠的图像字节数据写入图像,预期的结果是让高字节作为真正“明亮”的迷你图像出现在图像的顶部,并且底部的低字节作为较暗的迷你图像。现在看起来高字节和低字节图像被重复了两次。我想知道是不是因为多个颜色通道?但我很确定 TYPE_BYTE_GRAY 给了我一个无符号的 8 位灰度图像。我很困惑为什么会发生这种重复。我将附上我的图像输出,以便您了解我的意思。
  • @CraigR8806,是的,我正在尝试将 imageInByte 放入 bImageFromConvert。
  • 错误不在您发布的代码中。我建议您按照帮助中心的说明创建一个MCVE,以突出问题并获得更好的帮助。

标签: java arrays byte bufferedimage


【解决方案1】:

使用 DataBufferByte 将字节数组复制到图像中是最快和最安全的方法。我做的完全一样,而且效果很好。

因此,如果结果不是你所期望的,那么只有两种可能:

  1. 您复制到 DataBuffer 中的数据并非您所希望的那样
  2. 写入图像时出现问题。

如果你想使用光栅而不是DataBuffer,你可以这样做。

for (int y=0, pos=0 ; y < dimHeight ; y++)
    for (int x=0 ; x < dimWidth ; x++)
        bImageFromConvert.getRaster().setSample(x, y, O, imageInByte[pos] & 0xFF) ;

但它必须与您之前所做的结果完全相同。 Raster 只是为您管理 en BufferedImage 编码。所以我确实认为您在其他地方有问题(请参阅我引用的两点)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2012-05-07
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多