web-dev-qa-db-de.com

Bitmap-Bytegröße nach Decodierung?

Wie kann ich die Bytegröße einer Bitmap ermitteln/berechnen (nach Decodierung mit BitmapFactory)? Ich muss wissen, wie viel Speicherplatz es belegt, da ich in meiner App Speicher-Caching/-Verwaltung durchführe. (Dateigröße reicht nicht aus, da es sich um JPG/PNG-Dateien handelt)

Vielen Dank für alle Lösungen!

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

62
user289463

getRowBytes() * getHeight() scheint für mich gut zu funktionieren.

Update auf meine ~ 2 Jahre alte Antwort: Seit API Level 12 kann Bitmap die Bytegröße direkt abfragen: 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();
        }
    }
113
user289463

Am besten nutzen Sie einfach die Support-Bibliothek:

int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap)

Aber wenn Sie das Android Projekt haben, um mindestens minSdk von 19 (KitKat, was 4.4 bedeutet) zu verwenden, können Sie einfach bitmap.getAllocationByteCount () verwenden.

43

Hier ist die Version 2014, die KitKats getAllocationByteCount() verwendet und so geschrieben ist, dass der Compiler die Versionslogik versteht (also wird @TargetApi Nicht benötigt)

/**
 * 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 von getAllocationByteCount() größer sein kann als das Ergebnis von getByteCount() Wenn eine Bitmap erneut verwendet wird, um andere Bitmaps kleinerer Größe zu decodieren, oder durch manuelle Neukonfiguration.

21
patrickf
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 zu @ user289463 besteht in der Verwendung von getAllocationByteCount() für KitKat und höhere Versionen.

5
ahmed_khan_89