2011-06-21 11 views
10

Sé que la plataforma de Android es un gran desastre, demasiado complicada y sobrediseñada, pero en serio para obtener el tamaño de un mapa de bits, ¿es realmente necesario hacer todas esas conversiones?¿Dónde diablos está Bitmap getByteCount()?

Bitmap bitmap = your bitmap object 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byte[] imageInByte = stream.toByteArray(); 
long length = imageInByte.length; 

Según mapa de bits Documentación Google tiene un método getByteCount() de hacer esto, sin embargo, no está presente en SDK2.2, no han probado otros de pero no hay ninguna mención de que sea obsoleta o que apoyan la API es cualquier diferente de API 1 ... Entonces, ¿dónde se esconde este método misterioso? Sería muy agradable estar Albe tareas simples

bitmap.getByteCount() 

Respuesta

12

Si filtra por la API de nivel 8 (= SDK 2.2), verá que Bitmap#getByteCount() está atenuada, lo que significa que el método no está presente en ese nivel API .

getByteCount() se añadió en la API de nivel 12.

+0

El SDK ahora le ayuda a detectar las API que está utilizando y que no existen en una versión más antigua (dirigida) en sus proyectos. –

61

que acabo de escribir este método. AndroidVersion.java es una clase que he creado para obtener fácilmente el código de versión del teléfono.

http://code.google.com/p/android-beryl/source/browse/beryl/src/org/beryl/app/AndroidVersion.java

public static long getSizeInBytes(Bitmap bitmap) { 
    if(AndroidVersion.isHoneycombMr2OrHigher()) { 
     return bitmap.getByteCount(); 
    } else { 
     return bitmap.getRowBytes() * bitmap.getHeight(); 
    } 
} 
+18

getByteCount() es solo 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()", no necesita la verificación de la versión de Android. –

+1

debe devolver '(bitmap.getRowBytes() * bitmap.getHeight())/1024;' –

1

Antes de API 12 se puede calcular el tamaño en bytes de un mapa de bits utilizando getHeight() * getWidth() * 4 si está utilizando ARGB_8888 porque cada píxel se almacena en 4bytes. Creo que este es el formato predeterminado.

1

Como se menciona en otras respuestas, solo está disponible en API 12 o superior. Esta es una versión de compatibilidad simple del método.

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

Probé todos los métodos anteriores y estaban cerca, pero no del todo bien (para mi situación al menos).

Estaba usando bitmap.getByteCount(); en el interior del método sizeof() al crear un nuevo LRUCache:

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { 
    @Override 
    protected int sizeOf(String key, Bitmap bitmap) { 
     return bitmap.getByteCount(); 
    } 
}; 

Luego probé la sugirió:

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

Esto fue genial, pero me di cuenta de que los valores devueltos eran diferentes y cuando utilicé la sugerencia anterior, ni siquiera haría una caché en mi dispositivo. Probé los valores de retorno en un Nexus One API de ejecución 3.2 y un Galaxy Nexus con 4.2:

bitmap.getByteCount(); returned-> 15 
bitmap.getRowBytes() * bitmap.getHeight(); returned-> 15400 

Así que para solucionar mi problema, yo simplemente hice esto:

return (bitmap.getRowBytes() * bitmap.getHeight())/1000; 

en lugar de:

return bitmap.getByteCount(); 

Puede que no sea la misma situación en la que estaba, pero esto funcionó para mí.

+0

en todas partes que miro, cada fuente que leo, todo lo veo 'return (bitmap.getRowBytes() * bitmap.getHeight())/1000; '. Debe ser el tipo de archivo que estoy guardando o algo así. Así que la próxima vez que necesite usar 'bitmap.getByteCount();', haré algunas pruebas para ver qué valor necesito primero. – levibostian

+0

debe devolver '(bitmap.getRowBytes() * bitmap.getHeight())/1024;' en su lugar. –

0

Como se puede ver en el código fuente, getByteCount es simplemente esto:

public final int getByteCount() { 
    // int result permits bitmaps up to 46,340 x 46,340 
    return getRowBytes() * getHeight(); 
} 

Here is the source code for 5.0

3

Las respuestas aquí son un poco anticuadas. Motivo (en el docs):

getByteCount: A partir de KITKAT, el resultado de este método ya no se puede utilizar para determinar el uso de memoria de un mapa de bits. Consulte getAllocationByteCount().

Por lo tanto, la respuesta actual debe ser:

int resultado = BitmapCompat.getAllocationByteCount (mapa de bits)

o, si insiste en escribir usted mismo:

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