【问题标题】:ByteArrayOutputStream length < width * heightByteArrayOutputStream 长度 < 宽度 * 高度
【发布时间】:2017-02-26 17:09:32
【问题描述】:

我对 ByteArrayOutputStream 有一个奇怪的问题。我正在尝试输入图像并将其转换为字节数组。图像为 270 x 480 像素。但是,如果我将数据设置为字节数组并输出 data.length 我得到 21195 但是 270 x 480 = 129600。它们不应该相同吗?我在这里做错了什么?

BufferedImage originalImage =
                                  ImageIO.read(new File("C:\\Users\\use\\Pictures\\mypic.jpg"));

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write( originalImage, "jpg", baos );
        baos.flush();
        data = baos.toByteArray();
        baos.close();

谢谢,

【问题讨论】:

  • 您错过了文件格式不存储纯像素值。尝试读/写bmp,你会发现它大约需要 width*height*3 字节(加上一些头部开销)

标签: java arrays image-processing


【解决方案1】:

如果每个像素恰好消耗一个字节来存储图像格式,那么你是对的。其实不是这样的。

不同的文件格式对像素的存储成本不同。

对于纯黑白(非灰度)图像,每个像素只需要一点。

在具有透明度的 PNG 图像中,除了红色、绿色和蓝色分量之外,每个像素还包含 alpha 分量(透明度/不透明度)。因此,图像表示中的字节数取决于图像格式和压缩。

BufferedImage 类可让您通过其位置操作任何像素。

try {
  BufferedImage img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
}

您可以使用getRGB(int x, int y)setRGB(int x, int y) 方法来获取或设置指定的像素。

【讨论】:

  • 那么我该如何修改我的代码,让我的图像完美地转换成二维数组呢?
  • 查看这里以获得您的问题的答案:stackoverflow.com/questions/6524196/…
  • java BufferedImage 类允许您通过其位置操作任何像素。
  • @jacksonecac 我的答案已根据您的要求进行了编辑。
【解决方案2】:

length &lt; width * height 只能在您的图像是二进制的情况下发生,所以如果类型是 TYPE_BYTE_BINARY。在这种情况下,编码/存储是逐行完成的,然后图像中的字节元素数为[width/8 + min(width%8, 1) ] * height

在具有多个通道/波段的图像的情况下它可能会更好,所以彩色图像。

在将图像转换为ByteArrayOutputStream 之前,请确保使用字节对图像进行编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2011-01-20
    • 2015-06-19
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多