web-dev-qa-db-fra.com

Taille des octets bitmap après décodage?

Comment puis-je déterminer/calculer la taille en octets d'un bitmap (après décodage avec BitmapFactory)? J'ai besoin de savoir combien d'espace mémoire il occupe, car je fais de la mise en cache/gestion de la mémoire dans mon application. (la taille du fichier ne suffit pas, car ce sont des fichiers jpg/png)

Merci pour toutes les solutions!

Mise à jour: getRowBytes * getHeight pourrait faire l'affaire. Je vais l'implémenter de cette façon jusqu'à ce que quelqu'un trouve quelque chose contre.

62
user289463

getRowBytes() * getHeight() semble bien fonctionner pour moi.

Mise à jour de ma réponse de ~ 2 ans: Étant donné que l'API niveau 12 Bitmap a un moyen direct d'interroger la taille des octets: http://developer.Android.com/reference/Android/graphics/Bitmap.html#getByteCount% 28% 29

---- Exemple de code

    @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

Il est préférable d'utiliser simplement la bibliothèque de support:

int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap)

Mais si vous avez le projet Android pour utiliser au moins minSdk de 19 (KitKat, ce qui signifie 4.4), vous pouvez simplement utiliser bitmap.getAllocationByteCount () .

43
android developer

Voici la version 2014 qui utilise getAllocationByteCount() de KitKat et est écrite pour que le compilateur comprenne la logique de la version (donc @TargetApi N'est pas nécessaire)

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

Notez que le résultat de getAllocationByteCount() peut être plus grand que le résultat de getByteCount() si un bitmap est réutilisé pour décoder d'autres bitmaps de plus petite taille, ou par reconfiguration manuelle.

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

La seule différence avec la réponse @ user289463 est l'utilisation de getAllocationByteCount() pour KitKat et les versions supérieures.

5
ahmed_khan_89