2015-11-08 94 views
1

JPEG是一種壓縮格式。 將BitmapFactory.decodeFile(「JPEG文件的路徑」)解碼爲內存中的位圖時,是否解壓JPEG圖像? 當我從解碼的JPEG文件生成的位圖上使用Bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream)時,則壓縮圖像的大小大於原始圖像的大小。任何人都可以解釋這種現象嗎?解碼時,BitmapFactory.decodeFile()文件是否解壓JPEG圖像?

回答

4

BitmapFactory.decodeFile(「指向JPEG文件的路徑」)是否在將JPEG圖像解碼爲內存中的位圖時將其解壓縮?

是。

當我在從解碼後的JPEG文件生成位圖使用Bitmap.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream),則壓縮的圖像的尺寸比原始圖像的尺寸更

這是非常可能的。質量等級爲100時,我會考慮它的可能性,雖然也許沒有保證。

任何人都可以解釋這種現象嗎?

沒有要求它們對於JPEG是相同的。實際上,如果他們都是一樣,它幾乎是隨機的。

假設我們從內存映像開始(B 原始,其中B是位圖的簡寫)。然後,我們將該圖像壓縮爲JPEG(J 原始)。 JPEG採用有損壓縮算法,通過考慮人眼無法辨別少量變化的事實,在實際圖像(例如照片)上實現更好的壓縮。

假設我們則J 原始回解碼成一個內存中的位圖(B 重新加載)。 B 重新加載將不會是相同的圖像作爲B 原來,因爲JPEG壓縮會改變圖像。 B 重新加載是B 原始將取決於各種因素,部分與圖像本身有關,部分與保存JPEG(100代碼中使用的質量級別)有關。質量等級從0到100,其中100表示​​最高質量。

如果我們然後壓縮乙重載到第二JPEG(j 重新加載),新的JPEG 不會是相同作爲原始JPEG(j 原始)。部分原因是,這是因爲根據前面的段落,源位圖發生了變化。部分原因是,這是因爲我們可能不會選擇與原始壓縮工作相同的質量級別。

在你的情況下,你沒有創建J 原始。您不一定知道使用了哪種質量等級(信息可能存儲在JPEG標頭中;我忘記了)。但是因爲B 重新加載將不同於原始位圖(無論它來自何處),當您將位圖壓縮爲J 重新加載時,它將與原始的J 不同。總體而言,不論是大還是小,都難以抽象地說。但是,由於您選擇的質量級別爲100,並且J 原始很可能已經以較低的質量級別壓縮,所以您的壓縮圖像很容易變大。

這與Android無關。這純粹是JPEG如何工作的功能。如果您還有關於JPEG本身的其他問題,您可能希望read more about JPEG,並在某些網站上提出與圖像格式有關的問題。