¿Cuánta memoria ocupará Android picture.draw?
El código fuente del método setImageViewBitmap (Bitmap bm) de Android no crea un nuevo mapa de bits, pero usa bm como referencia, lo que hará que se haga referencia a bm en varios lugares).
Entonces, ¿cuánta memoria ocupa una imagen? Esta publicación de blog registra principalmente parte de la información que consulté y los resultados de mi prueba de cuántos bytes ocupa la imagen.
1. Representación de imágenes
Bitmap.Config de Android proporciona el método de almacenamiento de un píxel en el mapa de bits, a saber, RGB_565, ARGB_8888, ARGB_4444 y ALPHA_8. RGB_565 significa que el rojo, el verde y el azul se almacenan en 5,6,5 bits, un píxel se almacena en 5,6,5 bits y un píxel se almacena en 5,6,5 bits. RGB_565 significa que el rojo, el verde y el azul se almacenan en 5,6,5 bits respectivamente, y un píxel ocupa 5+6+5=16 bits. RGB_8888 significa que los colores rojo, verde, azul y translúcido se almacenan en 8, 8, 8, 8 bits respectivamente, y un píxel ocupa 8+8+8=32 bits. En este caso, si la imagen se lee como RGB_8888, ocupará el doble de memoria que si se lee como RGB_565.
Por lo general, cargamos imágenes para Imagview a través de setDrawable o usamos la configuración de android:src en archivos xml. En la documentación de BitmapFactory.Options.inPreferredConfig, podemos ver que la forma predeterminada de cargar el tamaño de la imagen es RGB_8888 Leer. . _8888 lee.
2. Obtener el número de bytes ocupados por el mapa de bits
API 12 y superiores se pueden obtener directamente. Lo siguiente se obtiene multiplicando el número de bytes ocupados por la fila alta. la fila.
protected int sizeOf(datos de mapa de bits) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) { return data.getRowBytes() * data .getHeight() } else { return data.getByteCount (); }
3.}
3.Leer la imagen como RGB_565
public ?Bitmap readBitMap(Context context, int resId){ ?BitmapFactory.Options opt = new BitmapFactory.Options(); ?opt.inPreferredConfig = Bitmap.Config.RGB_565; ?opt.inPurgeable = true; //obtener imagen de recurso InputStream es = context.getResources().openRawResource(resId) ); return BitmapFactory.DecodeStream(is,n); ?decodeStream(is,null,opt);}
4. Obtener el tamaño de ImageView y los objetos dibujables que contiene
Obtener ImageView El tamaño del objeto dibujable debe obtenerse en onWindowFocusChanged, y el resultado devuelto en oncreate es 0.
public void onWindowFocusChanged(boolean hasFocus){ ImageView imageView=(ImageView)findViewById(R.id.test1); Log.v("Testresult", "width=" + imageView.getWidth()+" altura= " +imageView.getHeight()); Log.v("Testresult", "drawawidth= " +imageView.getDrawable().getBounds().width() + " drawableheight= " +imageView.getDrawable().getBounds ().height()); }
Código de prueba en 5.Oncreate()
protected void onCreate(Bundle saveInstanceState) { super.onCreate(savedInstanceState); diseño.actividad_main); ImageView imageView=(ImageView) findViewById(R.id.test1); dibujable dibujable = imageView.getDrawable(); int bitmapWidth = drawable.getIntrinsicWidth(); drawable.getIntrinsicWidth(); int bitmapWidth = drawable.getIntrinsicWidth()getIntrinsicWidth(); //este es el ancho del mapa de bits int bitmapHeight = drawable.getIntrinsicHeight() //esta es la altura del mapa de bits Log.v("Testresult", " bitmapwidth= " +bitmapWidth+" bitmapHeight= " +bitmapHeight); Bitmap bitmap=((BitmapDrawable)imageView.getDrawable()).getBitmap(); if (Build.VERSION.SDK_INT).VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1 ) { Log.v("Testresult", "los bytes del mapa de bits son "+bitmap.getRowBytes()*bitmap.getHeight() } else { Log.v("Testresult", "los bytes del mapa de bits son "+bitmap.getByteCount( ) ); } bitmap=readBitMap(this, R.drawable.pic_1000_562); //api 12 Además, también puede obtener directamente el número de bytes ocupados por el mapa de bits si (Build. VERSION.SDK_INT < Build.VERSION_CODES. HONEYCOMB_MR1) { Log.v("Probador
sult", "los bytes de mapa de bits son "+bitmap.getRowBytes()*bitmap.getHeight()); } else { Log.v("Testresult", "los bytes de mapa de bits son "+bitmap.getByteCount()); } } p>
6.}
6.Resultados de la prueba
El tamaño de la imagen original es 1000*562 y la resolución de la pantalla del teléfono móvil es 480*800. Se puede ver que el número de bytes ocupados por el método de carga android:src es 2 veces mayor que el del método de carga RGB_565, y 1124000=2*1000*562 bytes. Aunque el mapa de bits se escalará cuando se muestre en el teléfono, el número de bytes ocupados por el método de carga android:src es 2 veces mayor que el del método de carga RGB_565. La longitud de la imagen dibujable es. El ancho ocupa el mismo número de bytes que el tamaño de la imagen.