Bitmap-Bytegröße nach der Dekodierung?

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer289463

Wie kann ich die Bytegröße einer Bitmap (nach der Dekodierung mit BitmapFactory) bestimmen/berechnen? Ich muss wissen, wie viel Speicherplatz es belegt, weil ich in meiner App Speicher-Caching/Speicherverwaltung durchführe. (Dateigröße reicht nicht aus, da es sich um jpg/png-Dateien handelt)

Danke für eventuelle Lösungen!

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

Benutzer-Avatar
Benutzer289463

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

Update zu meiner ~ 2 Jahre alten Antwort: Seit API-Level 12 hat Bitmap eine direkte Möglichkeit, die Bytegröß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();
        }
    }

  • Versuchte es so: original = BitmapFactory.decodeStream(getAssets().open(“hd.jpg”)); sizeOf (Original); ByteArrayOutputStream out = new ByteArrayOutputStream(); original.compress (Bitmap.CompressFormat.WEBP, 50, aus); Bitmap dekodiert = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); sizeOf (dekodiert); Wenn ich in Ihrer Methode debugge, bekomme ich die gleiche Anzahl von Bytes, auch wenn das zweite Bild komprimiert ist! Irgendwelche Kommentare?

    – Tharaka Nirmana

    5. Juni 2013 um 11:49 Uhr

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

    – Lächerlich

    10. Juli 2013 um 19:58 Uhr


  • Zeit, die Kitkat-Methode zu aktualisieren und hinzuzufügen getAllocationByteCount(). Sehen developer.android.com/reference/android/graphics/…

    – Itai Hanski

    27. Februar 2014 um 12:23 Uhr

  • Ich habe ein Bild, aber wenn ich es in zwei verschiedene Bilder laufen lasse, bekomme ich auf beiden Geräten aus irgendeinem Grund unterschiedliche Bildgrößen? zum Beispiel im Galaxy S Duos gibt 656 KB und im MOTO G-Gerät 1136 KB zurück

    – Kalpesh Lakhani

    21. Juni 2014 um 9:38 Uhr


  • @Kalpesh Ihr Samsung hat einen HDPI-Bildschirm und das Moto ein xhdpi, sodass auf diesen Modellen Ressourcen in verschiedenen Größen geladen werden. Schauen Sie sich das Google Display Densitiy Bucket-Dokument an.

    – Patrick Favre

    19. Oktober 2014 um 10:20 Uhr


Benutzer-Avatar
Android-Entwickler

Verwenden Sie am besten einfach die Support-Bibliothek:

int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap)

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

  • Ich erhalte die Anzahl der Zuordnungsbytes 3145728 mit BitmapCompat.getAllocationByteCount(scaledBitmap). Aber die tatsächliche Größe beträgt 207kB. Was mache ich falsch?

    – Aman Verma

    21. Januar 2019 um 10:05 Uhr

  • @Sniper Echte Größe von was? Wenn Sie die Dateigröße meinen, ist das sinnvoll, da die Datei komprimiert ist. Heutzutage wird niemand das Bild in eine Datei einfügen, ohne es in JPG/PNG/WEBP zu codieren. Die Dateien sollten nicht die gleiche Größe wie das dekodierte Bild haben. Die geschätzte Byteanzahl für jedes Bild ist width*height*bytesPerPixel wobei bytesPerPixel normalerweise 4 oder 2 ist. Dies bedeutet, dass ein 1000 x 1000-Bild etwa 4 * 1000 * 1000 = 4.000.000 Bytes benötigen könnte, was ~ 4 MB bedeutet.

    – Android-Entwickler

    21. Januar 2019 um 10:11 Uhr

  • Ich habe eine Bitmap in meinem onactivityResult und möchte die Größe des Bildes überprüfen und prüfen, ob die Größe größer als 5 MB ist oder nicht, und es dann an meinen Server senden, wenn weniger als 5 MB andernfalls den Benutzer auffordern, ein neues Bild aufzunehmen.

    – Aman Verma

    21. Januar 2019 um 10:39 Uhr

  • @Sniper Sie senden eine Bilddatei an den Server. Dies ist in der Regel JPEG, PNG, WEBP … All diese benötigen normalerweise weniger als 5 MB Speicherplatz, da sie komprimiert sind. Sie nehmen auch fast immer weniger Speicherplatz ein, als die Bitmap im Speicher einnimmt. Überprüfen Sie einfach die Dateigröße, nachdem Sie sie mit erstellt haben file.length : developer.android.com/reference/java/io/File.html#length() . Das hat nichts mit der Bitmap zu tun. Die Bitmap-Auflösung kann groß oder klein sein. Worüber Sie sprechen, ist die Datei selbst.

    – Android-Entwickler

    21. Januar 2019 um 12:15 Uhr


  • Danke @androiddeveloper für die Klarstellung.

    – Aman Verma

    21. Januar 2019 um 14:37 Uhr

Benutzer-Avatar
Patrick Favré

Hier ist die Version von 2014, die KitKat verwendet getAllocationByteCount() und ist so geschrieben, dass der Compiler die Versionslogik versteht (so @TargetApi wird 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() kann größer sein als das Ergebnis von getByteCount() wenn eine Bitmap wiederverwendet wird, um andere Bitmaps kleinerer Größe zu decodieren, oder durch manuelle Neukonfiguration.

  • Ja, Picasso verwendet diese Funktion auch zur Berechnung der Bitmap-Größe.

    – Wangzhengyi

    20. Juni 2016 um 12:14 Uhr

  • Ich erhalte die Anzahl der Zuordnungsbytes 3145728 mit BitmapCompat.getAllocationByteCount(scaledBitmap). Aber die tatsächliche Größe beträgt 207kB. Was mache ich falsch?

    – Aman Verma

    21. Januar 2019 um 10:00 Uhr

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 zur Antwort von @ user289463 ist die Verwendung von getAllocationByteCount() für KitKat und höhere Versionen.

1265840cookie-checkBitmap-Bytegröße nach der Dekodierung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy