Java ByteArrayOutputStream长度<;宽*高

Java ByteArrayOutputStream长度<;宽*高,java,arrays,image-processing,Java,Arrays,Image Processing,我对ByteArrayOutputStream有一个奇怪的问题。我正在尝试输入一个图像并将其转换为一个字节数组。图像为270 x 480像素。但是,如果我将数据设置为字节数组并输出data.length,则得到21195,但270 x 480=129600。它们不应该是一样的吗?我做错了什么 BufferedImage originalImage = ImageIO.read(new File("C:\\Users\\use\\

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

谢谢,

如果图像格式中的每个像素仅消耗一个字节的存储空间,那么您是对的。事实并非如此

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

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

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

buffereImage
类允许您通过其位置操纵任何像素

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

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

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

在图像具有多个通道/波段的情况下,它可能更出色,因此彩色图像


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

您缺少的是文件格式不存储普通像素值。试着读/写一个
bmp
,你会发现它大约需要3个字节(加上一些头的开销)那么,如何修改我的代码,使我的图像能够完美地转换为2d数组呢?请参见此处,以获取您问题的答案:java BuffereImage类允许您根据像素的位置来操作任何像素。@jacksonecac我的答案是根据您的要求进行编辑的。