2010-03-09 29 views
54

Làm cách nào để xác định/tính kích thước byte của bitmap (sau khi giải mã bằng BitmapFactory)? Tôi cần phải biết bao nhiêu không gian bộ nhớ nó chiếm, bởi vì tôi đang làm bộ nhớ đệm/quản lý trong ứng dụng của tôi. (kích thước tệp không đủ, vì đây là các tệp jpg/png)Kích thước byte bitmap sau khi giải mã?

Cảm ơn mọi giải pháp!

Cập nhật: getRowBytes * getHeight có thể thực hiện thủ thuật .. Tôi sẽ thực hiện theo cách này cho đến khi có ai đó đưa ra điều gì đó chống lại nó.

Trả lời

108

getRowBytes() * getHeight() dường như hoạt động tốt với tôi.

Update để ~ câu trả lời 2 tuổi của tôi: Kể từ mức API Bitmap 12 có một cách trực tiếp để truy vấn kích thước byte: http://developer.android.com/reference/android/graphics/Bitmap.html#getByteCount%28%29

---- Mẫu mã

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) 
    protected int sizeOf(Bitmap data) { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) { 
      return data.getRowBytes() * data.getHeight(); 
     } else { 
      return data.getByteCount(); 
     } 
    } 
+0

thử nó như thế này: gốc = BitmapFactory.decodeStream (. GetAssets() mở ("hd.jpg")); \t \t \t sizeOf (bản gốc); ByteArrayOutputStream out = new ByteArrayOutputStream(); \t \t original.compress (Bitmap.CompressFormat.WEBP, 50, ra); \t \t Bitmap decoded = BitmapFactory.decodeStream (ByteArrayInputStream mới (out.toByteArray())); \t \t sizeOf (giải mã); Khi tôi gỡ lỗi bên trong phương thức của bạn, tôi nhận được cùng số byte ngay cả khi hình ảnh thứ hai được nén! Có ý kiến ​​gì không? – TharakaNirmana

+1

@TharakaNirmana Một Bitmap luôn chứa hình ảnh không nén. Nén chỉ được sử dụng để thu nhỏ hình ảnh để lưu vào một tệp. – Ridcully

+1

thời gian để cập nhật và thêm phương thức kitkat của 'getAllocationByteCount()'. Xem http://developer.android.com/reference/android/graphics/Bitmap.html#getAllocationByteCount() –

21

Đây là phiên bản 2014 sử dụng KitKat getAllocationByteCount() và được viết để trình biên dịch hiểu được logic phiên bản (vì vậy @TargetApi là không cần thiết)

/** 
* returns the bytesize of the give bitmap 
*/ 
public static int byteSizeOf(Bitmap bitmap) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     return bitmap.getAllocationByteCount(); 
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) { 
     return bitmap.getByteCount(); 
    } else { 
     return bitmap.getRowBytes() * bitmap.getHeight(); 
    } 
} 

Lưu ý rằng kết quả của getAllocationByteCount()có thể lớn hơn kết quả của getByteCount() nếu bitmap được sử dụng lại để giải mã các ảnh bitmap có kích thước nhỏ hơn hoặc bằng cách định cấu hình lại thủ công.

+0

Có, Picasso cũng sử dụng chức năng này để tính kích thước bitmap. – wangzhengyi

6
public static int sizeOf(Bitmap data) { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) { 
     return data.getRowBytes() * data.getHeight(); 
    } else if (Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT){ 
     return data.getByteCount(); 
    } else{ 
     return data.getAllocationByteCount(); 
    } 
} 

Sự khác biệt duy nhất với câu trả lời @ user289463, là sử dụng getAllocationByteCount() cho các phiên bản KitKat trở lên.

29

Tốt nhất là chỉ cần sử dụng các thư viện hỗ trợ:

int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap) 
+0

Rất thú vị! Cảm ơn – mbritto

Các vấn đề liên quan