2010-03-09 4 views
54

Wie kann ich die Bytegröße einer Bitmap ermitteln/berechnen (nach der Decodierung mit BitmapFactory)? Ich muss wissen, wie viel Speicherplatz es belegt, weil ich Speicher-Caching/-Management in meiner App mache. (Dateigröße ist nicht genug, da dies jpg/png-Dateien sind)Bitmap-Byte-Größe nach der Decodierung?

Danke für alle Lösungen!

Update: getRowBytes * GetHeight könnte den Trick machen .. Ich werde es auf diese Weise implementieren, bis jemand etwas dagegen vorkommt.

Antwort

108

getRowBytes() * getHeight() scheint mir gut zu funktionieren.

Update auf meine ~ 2 Jahre alte Antwort: Da API-Ebene 12 Bitmap hat einen direkten Weg, um die Byte-Größe abzufragen: http://developer.android.com/reference/android/graphics/Bitmap.html#getByteCount%28%29

---- Beispielcode

@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

es so versucht: original = BitmapFactory.decodeStream (. GetAssets() offen ("HD.jpg")); \t \t \t sizeOf (Original); ByteArrayOutputStream out = neues ByteArrayOutputStream(); \t \t original.compress (Bitmap.CompressFormat.WEBP, 50, aus); \t \t Bitmap decodiert = BitmapFactory.decodeStream (neuer ByteArrayInputStream (out.toByteArray())); \t \t sizeOf (decodiert); Wenn ich innerhalb der Methode debuggen, bekomme ich die gleiche Anzahl von Bytes, auch wenn das zweite Bild komprimiert ist! Irgendwelche Kommentare? – TharakaNirmana

+1

@TharakaNirmana Eine Bitmap enthält immer das unkomprimierte Bild. Die Komprimierung wird nur verwendet, um ein Bild zum Speichern in einer Datei zu verkleinern. – Ridcully

+1

Zeit zum Aktualisieren und Hinzufügen der Kitkat-Methode von 'getAllocationByteCount()'. Siehe http://developer.android.com/reference/android/graphics/Bitmap.html#getAllocationByteCount() –

21

Hier die 2014-Version, die getAllocationByteCount() KitKat die verwendet und ist so geschrieben, dass der Compiler die Version Logik versteht (so wird @TargetApi nicht erforderlich)

/** 
* 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(); 
    } 
} 

Beachten Sie, dass das Ergebnis getAllocationByteCount() größer sein kann als das Ergebnis getByteCount(), wenn eine Bitmap erneut zum Decodieren anderer Bitmaps kleinerer Größe oder durch manuelle Neukonfiguration verwendet wird.

+0

Ja, Picasso verwendet diese Funktion auch, um Bitmap-Größe zu berechnen. – 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(); 
    } 
} 

Der einzige Unterschied mit @ user289463 Antwort, ist die Verwendung von getAllocationByteCount() für KitKat und über Versionen.

29

Am besten ist es, nur die Support-Bibliothek verwenden:

int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap) 
+0

Schöner Fang! Vielen Dank – mbritto