Android: bitmap.getByteCount () en API inferior a 12

Cuando busqué cómo encontrar el tamaño de una imagen antes de guardarla en la tarjeta SD, encontré esto:

bitmap.getByteCount(); 

Pero ese método se agrega en API 12 y estoy utilizando API 10. Así que de nuevo me enteré de esto:

GetByteCount () es sólo un método de conveniencia que hace exactamente lo que ha colocado en el bloque-else. En otras palabras, si simplemente reescribe getSizeInBytes para devolver siempre "bitmap.getRowBytes () * bitmap.getHeight ()"

aquí:

¿Dónde diablos es Bitmap getByteCount ()?

Por lo que, mediante el cálculo de este bitmap.getRowBytes() * bitmap.getHeight() i obtuvo el valor 120000 (117 KB) .

Donde como el tamaño de la imagen en la tarjeta SD es de 1.6 KB .

¿Qué me estoy perdiendo? O haciendo mal?

Gracias

¡Lo estás haciendo correctamente!

Una manera rápida de saber con certeza si los valores son válidos, es registrarlo así:

 int numBytesByRow = bitmap.getRowBytes() * bitmap.getHeight(); int numBytesByCount = bitmap.getByteCount(); Log.v( TAG, "numBytesByRow=" + numBytesByRow ); Log.v( TAG, "numBytesByCount=" + numBytesByCount ); 

Esto da el resultado:

 03-29 17:31:10.493: V/ImageCache(19704): numBytesByRow=270000 03-29 17:31:10.493: V/ImageCache(19704): numBytesByCount=270000 

Así que ambos están calculando el mismo número, que sospecho que es el tamaño en memoria del mapa de bits. Esto es diferente de un JPG o PNG en disco, ya que está completamente descomprimido.


Para más información, podemos ver a AOSP y la fuente en el proyecto de ejemplo. Este es el archivo utilizado en el proyecto de ejemplo BitmapFun en el desarrollador de Android docs Caching Bitmaps

AOSP ImageCache.java

 /** * Get the size in bytes of a bitmap in a BitmapDrawable. * @param value * @return size in bytes */ @TargetApi(12) public static int getBitmapSize(BitmapDrawable value) { Bitmap bitmap = value.getBitmap(); if (APIUtil.hasHoneycombMR1()) { return bitmap.getByteCount(); } // Pre HC-MR1 return bitmap.getRowBytes() * bitmap.getHeight(); } 

Como se puede ver, esta es la misma técnica que usan

 bitmap.getRowBytes() * bitmap.getHeight(); 

Referencias:

Por ahora estoy usando esto:

 ByteArrayOutputStream bao = new ByteArrayOutputStream(); my_bitmap.compress(Bitmap.CompressFormat.PNG, 100, bao); byte[] ba = bao.toByteArray(); int size = ba.length; 

Para obtener un número total de bytes como tamaño. Porque el valor que obtengo aquí coincide perfectamente con el tamaño (en bytes) de la imagen en la tarjeta SD.

¡No falta nada! Su codesnippet muestra exacta la implementación de Android-Fuente:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/graphics/Bitmap.java#Bitmap.getByteCount%28%29

Creo que las diferencias de tamaño son el resultado de la compresión de imágenes (jpg y así sucesivamente).

Puede u puede intentar este código

 int pixels = bitmap.getHeight() * bitmap.getWidth(); int bytesPerPixel = 0; switch(bitmap.getConfig()) { case ARGB_8888: bytesPerPixel = 4; break; case RGB_565: bytesPerPixel = 2; break; case ARGB_4444: bytesPerPixel = 2; break; case ALPHA_8 : bytesPerPixel = 1; break; } int byteCount = pixels / bytesPerPixel; 

Aquí está una manera alternativa:

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

Una declaración del IDE para getAllocationByteCount() :

Esto puede ser mayor que el resultado de getByteCount () si un mapa de bits se reutiliza para decodificar otros mapas de bits de menor tamaño o por reconfiguración manual. Consulte reconfiguración (int, int, Bitmap.Config), setWidth (int), setHeight (int), setConfig (Bitmap.Config) y BitmapFactory.Options.inBitmap. Si un mapa de bits no se modifica de esta manera, este valor será el mismo que devuelto por getByteCount ().

La imagen en la tarjeta sd tiene un tamaño diferente porque está comprimido. En el dispositivo dependerá de la anchura / altura

¿Por qué no intentas dividirlo entre 1024? Para obtener el KB en lugar de Bytes.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.