Java ByteArrayOutputStream长度<;宽*高
我对ByteArrayOutputStream有一个奇怪的问题。我正在尝试输入一个图像并将其转换为一个字节数组。图像为270 x 480像素。但是,如果我将数据设置为字节数组并输出data.length,则得到21195,但270 x 480=129600。它们不应该是一样的吗?我做错了什么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\\
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我的答案是根据您的要求进行编辑的。