【发布时间】: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