android getimagesize

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



getimagesize (7)

Lo estás haciendo correctamente!

Una forma rápida de saber con seguridad 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

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

Para obtener más información, podemos ver AOSP y la fuente en el proyecto de ejemplo. Este es el archivo utilizado en el proyecto de ejemplo BitmapFun en la documentación del desarrollador de Android 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 pueden ver, esta es la misma técnica que usan.

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

Referencias:

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 usando API 10. Así que nuevamente descubrí esto:

getByteCount () es solo un método conveniente que hace exactamente lo que has colocado en el bloque else. En otras palabras, si simplemente reescribe getSizeInBytes para devolver siempre "bitmap.getRowBytes () * bitmap.getHeight ()"

aquí:

¿Dónde diablos está Bitmap getByteCount ()?

entonces, al calcular este bitmap.getRowBytes() * bitmap.getHeight() obtuve el valor 120000 (117 KB) .

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

¿Qué me estoy perdiendo? o haciendo mal?

Gracias



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


Aquí hay una forma 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 más grande 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 reconfigurar (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 el 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 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 total de no.of bytes como tamaño. Porque el valor que obtengo aquí coincide perfectamente con el tamaño (en bytes) en la imagen en la tarjeta SD.


puede u puede probar 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;