¿Cuál es la diferencia entre Bitmap y Drawable en Android?

7 minutos de lectura

avatar de usuario
nikhil c george

Busqué en Google pero no pude encontrar ningún artículo para describir la diferencia entre Bitmap y Drawable en Android.

  • Esta solución debería ser capaz de responder a sus preguntas: solución

    – Jrom

    20 de enero de 2012 a las 5:24

avatar de usuario
ted salto

Un mapa de bits es una representación de una imagen de mapa de bits (algo así como java.awt.Image). Un Drawable es una abstracción de “algo que se puede dibujar”. Podría ser un mapa de bits (envuelto como un BitmapDrawable), pero también podría ser un color sólido, una colección de otros objetos dibujables o cualquier número de otras estructuras.

A la mayor parte del marco de la interfaz de usuario de Android le gusta trabajar con objetos dibujables, no con objetos de mapa de bits. Una Vista puede aceptar cualquier Drawable como fondo. Un ImageView puede mostrar un Drawable en primer plano. Las imágenes almacenadas como recursos se cargan como objetos dibujables.

  • si un bitmapDrawable envuelve un mapa de bits, ¿qué ocurriría si llamamos a recycle() en el mapa de bits dentro de él? Además, ¿qué hace recycle() para API11 y superior?

    – desarrollador de Android

    14 de agosto de 2012 a las 12:41

  • @androiddeveloper: no estoy seguro, pero no será nada bueno. Una vez que un mapa de bits está envuelto por un BitmapDrawable, el dibujable “posee” el mapa de bits y se supone que debe administrar su vida. si llamas recycle(), estás interfiriendo con esa relación. En el mejor de los casos, lo dibujable no dibujará nada; lo más probable es que se produzca algún tipo de excepción más adelante. De acuerdo a los documentos, recycle() with API11+ hace lo mismo que siempre: te permite liberar los píxeles nativos tan pronto como sabes que has terminado con ellos.

    –Ted Hopp

    14 de agosto de 2012 a las 15:26

  • ahí dicen que libera la memoria nativa del mapa de bits, pero sabemos que a partir de la API 11, todo lo relacionado con el mapa de bits (incluidos sus datos sin procesar) está dentro del montón, por lo que reciclar parece algo raro de hacer…

    – desarrollador de Android

    14 de agosto de 2012 a las 21:46

  • @androiddeveloper – Mirando el fuente, parece que todavía hay un mapa de bits nativo. Por motivos de rendimiento, el búfer sin procesar se expone como un miembro público (aunque aún se oculta de la API pública). Vocación recycle() aún liberará el mapa de bits nativo; también establecerá el búfer de miembros en null.

    –Ted Hopp

    15 de agosto de 2012 a las 1:25

  • sí, yo también lo he leído, pero no tiene sentido, ya que dijeron en google IO que el mapa de bits ya no se almacena en la memoria nativa. Estoy realmente confundido de cómo podría ser.

    – desarrollador de Android

    15 de agosto de 2012 a las 5:57

El mapa de bits no es una imagen. Bitmap es un mapa de bits (note el nombre: Bit-map). Y este mapa representa píxeles en los que puedes dibujar algo. Puede ser su propio mapa de bits personalizado (no imagen), por ejemplo, cuadrado:

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);

o puede crear un objeto de mapa de bits a partir de una imagen:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);    

Un mapa de bits es un contenedor de píxeles. Y Canvas se usa para dibujar algo en su mapa de bits (en píxeles de mapa de bits).

Todo sobre Drawable está bien descrito arriba.

TL;DR

Algunas personas escriben que dibujas en Canvas. No dibujas en Canvas. Dibujas en píxeles de mapa de bits con el método auxiliar de Canvas.

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.RED) // now all bitmap pixels became red

  • Buena respuesta merece +1 🙂 Gracias por la explicación por líneas de código.

    – Harshit Madhav

    1 de agosto de 2018 a las 14:31

  • perfectamente explicado

    – Tushar Srivastava

    24 de enero de 2019 a las 9:15

avatar de usuario
Barmaley

Dibujable es algo que se puede dibujar. Por ejemplo, diseño, imagen vectorial (línea, círculo), fuente, imagen, etc.

Mapa de bits: es un tipo específico de Drawable que es una imagen, como: PNG, JPEG o algo así

  • A mapa de bits (android.graphics.Bitmap) no es una subclase de Dibujable (android.graphics.drawable.Drawable).

    –Ted Hopp

    20 de enero de 2012 a las 15:16

  • Claro, es mi culpa. Quise decir BitmapDrawable

    – Barmaley

    20 de enero de 2012 a las 17:53

  • pero dicen Mapa de bits: el Drawable más simple, una imagen PNG o JPEG. en documentos

    – mallaudín

    21 de noviembre de 2018 a las 13:46

  • Pensé que había pegado desde este enlace. desarrollador.android.com/guide/topics/resources/…

    – mallaudín

    4 de diciembre de 2018 a las 16:25

avatar de usuario
Misba Farooqi

Recurso dibujable

A Drawable recurso es un concepto general para un gráfico que se puede dibujar en la pantalla y que se puede recuperar con API como getDrawable(int) o aplicar a otro recurso XML con atributos como android:drawable y android:icon. Hay varios tipos diferentes de dibujables:

  • Archivo de mapa de bitsUn archivo gráfico de mapa de bits (.png, .jpg o .gif) crea un BitmapDrawable.

  • Archivo de nueve parchesA PNG archivo con regiones estirables para permitir el cambio de tamaño de la imagen según el contenido (.9.png), crea un NinePatchDrawable.

  • Lista de capasA Drawable que gestiona una serie de otros Drawables. Estos se dibujan en orden de matriz, por lo que el elemento con el índice más grande se dibuja en la parte superior, crea un LayerDrawable.

  • Lista de estadosUn XML archivo que hace referencia a diferentes gráficos de mapa de bits para diferentes estados (por ejemplo, para usar una imagen diferente cuando se presiona un botón), crea un StateListDrawable.

  • Lista de nivelesUn XML archivo que define un Drawable que gestiona una serie de alternativas Drawables, cada uno asignado a un valor numérico máximo, crea un LevelListDrawable.

  • Transición DibujableUn XML archivo que define un Drawable que puede fundirse entre dos Drawable recursos, crea un TransitionDrawable.

  • Insertable dibujableUn XML archivo que define un Drawable que inserta otro Drawable por una distancia especificada. Esto es útil cuando un View necesita un fondo Drawble que es más pequeño que los límites reales de la Vista.

  • Clip dibujableUn XML archivo que define un Drawable que recorta otro Drawable basado en esto Drawableel valor de nivel actual de , crea un ClipDrawable.

  • Escala dibujableUn XML archivo que define un Drawable que cambia el tamaño de otro Drawable basado en su valor de nivel actual, crea un ScaleDrawable.

  • Forma dibujableUn XML archivo que define una forma geométrica, incluidos colores y degradados, crea un ShapeDrawable.

Consulte también el documento Recursos de animación para saber cómo crear un AnimationDrawable.

Nota: Un recurso de color también se puede utilizar como Ddrawable en XML. Por ejemplo, al crear un StateListDrawablepuede hacer referencia a un recurso de color para el android:drawable atributo (android:drawable="@color/green").

mapa de bits

Una imagen de mapa de bits. Android admite archivos de mapa de bits en tres formatos: .png (preferido), .jpg (aceptable), .gif (no recomendado).

Puede hacer referencia a un archivo de mapa de bits directamente, utilizando el nombre de archivo como ID de recurso, o crear un ID de recurso de alias en XML.

Nota: los archivos de mapa de bits pueden optimizarse automáticamente con la compresión de imágenes sin pérdidas mediante la herramienta aapt durante el proceso de creación. Por ejemplo, un PNG de color verdadero que no requiere más de 256 colores se puede convertir a un PNG de 8 bits con una paleta de colores. Esto dará como resultado una imagen de igual calidad pero que requiere menos memoria. Por lo tanto, tenga en cuenta que los archivos binarios de imágenes colocados en este directorio pueden cambiar durante la compilación. Si planea leer una imagen como un flujo de bits para convertirla en un mapa de bits, coloque sus imágenes en el res/raw/ en su lugar, donde no se optimizarán.

¿Ha sido útil esta solución?