ByteArrayOutputStream长度<宽*高

时间:2016-10-17 16:11:28

标签: java arrays image-processing

我对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();

感谢,

2 个答案:

答案 0 :(得分: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)方法来获取或设置指定的像素。

答案 1 :(得分:0)

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

对于具有多个通道/波段的图像,它可以是优越的,因此彩色图像。

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