我有一個Bitmap,我想以 KB、MB 等為單位獲取位圖的大小
TRID NUMBER 1 - 所以我嘗試了這個,但它回傳錯誤的輸出,因為我有一個大小為42.57 KB的影像, 但在結果中,它回傳128 B
// originalBitmap is global var
ByteArrayOutputStream stream = new ByteArrayOutputStream();
originalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] imageInByte = stream.toByteArray();
long bitmap_size = imageInByte.length / 1024;
Log.d(TAG, "size of bitmap - " Formatter.formatShortFileSize(this,bitmap_size));
TRID NUMBER 2 - 所以在這個嘗試中只是簡單地完成了這件事,但它也顯示了錯誤的輸出,它顯示了1.2 MB的相同影像,其大小為42.57 KB
Log.d(TAG, "Image size : " Formatter.formatShortFileSize(this, originalBitmap.getByteCount()));
注意:我沒有真正的設備,所以在模擬器中進行了測驗。這可能是原因還是您認為
任何幫助將不勝感激!謝謝。
uj5u.com熱心網友回復:
不要除以 1024
long bitmap_size = imageInByte.length / 1024;
如果您使用的是 Formatter.formatShortFileSize,則只需使用位元組陣列的原始長度。
此代碼使用以下代碼壓縮影像:
originalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
你怎么知道壓縮后影像的大小?您可以將壓縮影像寫入檔案,但imageInByte.length必須是位元組陣列中的位元組數。你確定不是這個尺寸嗎?
uj5u.com熱心網友回復:
您說“我有一個大小為 42.57 KB 的影像”,我想它不是真正的位圖,而是一些 JPEG、PNG、WEBP 或其他影像格式。如果您在 Java 中使用 BitmapFactory 匯入此影像,則解碼器會在由 Width x Height x 3 制作的真實位圖中“擴展”壓縮影像位元組(如果原始影像格式支持 apha,則為“4”)。因此,在執行“ Bitmap.getByteCount() ”時,Java 中 100x100 PNG 檔案的簡單 1Kb 影像可能會變為 100x100*3 = 30000 = 30Kb 。以不同或相似的格式壓縮(再次)這個 30Kb 位圖可能會生成不同的輸出,因此最終長度也會不同。
也許你需要一些解釋:
- 在 Java 中,位圖只是一個位元組陣列。位圖,作為一個檔案,由一個 Header 和相同的位元組陣列組成。
- 如果您將 Java 位圖壓縮成 JPEG 流,您將獲得最終的 JPEG,其內容與您需要寫入檔案的內容完全相同(又名:此輸出無法直接在 Java 中顯示)
因此,您正在壓縮位圖以獲得壓縮的 JPEG,然后您將獲得 JPEG 長度(包括標題)。不知不覺壓縮檔案通常比原始檔案小。
- 如果您不想要 JPEG 長度但位圖長度,您可以通過執行“Formatter.formatShortFileSize(this, BITMAP .getByteCount())”來接近正確。
- 如果您想要 JPEG 長度(壓縮后的長度),則不要除以 1024,因為 Formatter 需要位元組而不是千位元組。
將壓縮或未壓縮的 Java 輸出與原始影像檔案進行比較有 99% 的“錯誤”,因為重新壓縮解壓縮的影像檔案通常會導致不同的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/408247.html
標籤:
