【问题标题】:How can I get a PNG from a byte Array (2 bytes/pixel)?如何从字节数组(2 字节/像素)中获取 PNG?
【发布时间】:2019-07-23 13:50:54
【问题描述】:

我有一个字节数组,其中我的数据以每个像素两个字节存储。我现在想从这些数据中得到一个 PNG。我找到了一个很棒的代码here

byte[] aByteArray = {0xa,0x2,0xf,(byte)0xff,(byte)0xff,(byte)0xff};
int width = 1;
int height = 2;

DataBuffer buffer = new DataBufferByte(aByteArray, aByteArray.length);

//3 bytes per pixel: red, green, blue
WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, 3 * width, 3, new int[] {0, 1, 2}, (Point)null);
ColorModel cm = new ComponentColorModel(ColorModel.getRGBdefault().getColorSpace(), false, true, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); 
BufferedImage image = new BufferedImage(cm, raster, true, null);

ImageIO.write(image, "png", new File("image.png"));

这里作者使用每个像素 3 个字节。所以我的问题是:如果我的字节数组每个像素有 2 个字节,我怎样才能使这段代码工作?

更新: 数据是灰度的,对不起,我以前不知道......所以没有必要获得彩色图像。那么你知道谁从这个字节数组中得到灰度图像吗?

【问题讨论】:

  • 首先,我们需要知道这两个字节是如何编码的……它会是 15 位颜色吗?这个每像素两个字节的图像是您创建的,还是您从某个地方获取的?
  • 我得到每个像素数组两个字节,它是用 12 bits_per_pixel 编码的,但它被舍入到每个像素 2 个字节
  • 然后你需要对像素做一些位移来将 3 位的组提取到单独的字节中......
  • @conryyy 如果用您收到的实际数据的示例更新您的问题会有所帮助。并指定它是 12 位/像素,0 填充到 16 位(如果确实如此)。我假设数据是灰度的,这是正确的吗?如果不是,请说明它是什么。最后,请不要回答其他评论,而是根据 SO 指南更新问题文本。 :-)
  • @conryyy 后续问题,因为 PNG 不直接支持 12 位/像素(只有 8 位或 16 位):是否可以丢失信息,并将图像截断为 8 位/像素,或者是否要将值缩放到 16 位/像素?

标签: java image bufferedimage


【解决方案1】:

在我看来,你必须给这个代码每个像素 3 个字节,所以它得到 RGB 的三种颜色。如果你想只用绿色和蓝色或其他组合来做到这一点,你应该为第三个设置一个默认值......但我不是 100% 确定。

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多