![](/img/trans.png)
[英]Length of an empty ByteArrayOutputStream / ZipOutputStream = 22?
[英]ByteArrayOutputStream length < width * height
我對 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 分量(透明度/不透明度)。 因此,圖像表示中的字節數取決於圖像格式和壓縮。
BufferedImage
類可讓您按位置操作任何像素。
try {
BufferedImage img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
}
您可以使用getRGB(int x, int y)
和setRGB(int x, int y)
方法來獲取或設置指定的像素。
length < width * height
只有在您的圖像是二進制的情況下才會發生,所以如果類型是 TYPE_BYTE_BINARY。 在這種情況下,編碼/存儲是逐行完成的,圖像中字節元素的數量為[width/8 + min(width%8, 1) ] * height
。
在具有多個通道/波段的圖像的情況下,它可能更勝一籌,因此彩色圖像。
在將圖像轉換為ByteArrayOutputStream
,請確保使用 Byte 對圖像進行編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.