Obtener mapa de bits adjunto a ImageView

314

Dado

ImageView image = R.findViewById(R.id.imageView);
image.setImageBitmap(someBitmap);

¿Es posible recuperar el mapa de bits?

limón
fuente
1
sí, es posible cuando hagas clic en la imagen y obtendremos que si quieres este requisito, házmelo saber.
RajaReddy PolamReddy

Respuestas:

809
Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();
Arslan Anwar
fuente
34
Tenga cuidado de verificar si image.getDrawable()realmente puede ser lanzado a BitmapDrawable(para evitar IllegalCastExceptions). Si, por ejemplo, usa capas en su imagen, este fragmento será ligeramente diferente:Bitmap bitmap = ((BitmapDrawable)((LayerDrawable)image.getDrawable()).getDrawable(0)).getBitmap();
Alex Semeniuk
2
Esto ocasionalmente devolverá un mapa de bits con algunos o todos los píxeles negros.
2
esto no devolverá el mapa de bits original ni el mapa de bits filtrado si ha aplicado en la vista dibujable / de imagen.
DearDhruv
44
¿funciona esto si ImageViewse establece la imagen en URI? imageView.setImageUri()
Hendra Anggrian
1
@praneethkumar funciona en mi escenario. ¡Gracias por esta increíble respuesta!
Hendra Anggrian
46

Esto te conseguirá una Bitmapde la ImageView. Sin embargo, no es el mismo objeto de mapa de bits que ha establecido. Es uno nuevo.

imageView.buildDrawingCache();
Bitmap bitmap = imageView.getDrawingCache();

=== EDITAR ===

 imageView.setDrawingCacheEnabled(true);
 imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
                   MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
 imageView.layout(0, 0, 
                  imageView.getMeasuredWidth(), imageView.getMeasuredHeight()); 
 imageView.buildDrawingCache(true);
 Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache());
 imageView.setDrawingCacheEnabled(false);
Sarwar Erfan
fuente
cuando "no funciona", ¿qué pasa? ¿Devuelve nulo o arroja una excepción o qué?
Sarwar Erfan
2
devuelve nulo. a veces tengo que volver a cargar la página para que aparezca realmente.
limón
3
Me da un puntero nulo. :( En esta línea:Bitmap bmap = Bitmap.createBitmap(mImageView.getDrawingCache());
Azurespot
drawingCache está en desuso en Kotlin
Raju yourPepe
3

Escribe debajo del código

ImageView yourImageView = (ImageView) findViewById(R.id.yourImageView);
Bitmap bitmap = ((BitmapDrawable)yourImageView.getDrawable()).getBitmap();
Pankaj Talaviya
fuente
obtengo AppCompatImageView no se puede enviar a android.graphics.drawable.BitmapDrawable
Billyjoker
1

Para aquellos que están buscando Kotlinuna solución para llegar Bitmapa ImageView.

var bitmap = (image.drawable as BitmapDrawable).bitmap
Asad Ali Choudhry
fuente
obtengo AppCompatImageView no se puede enviar a android.graphics.drawable.BitmapDrawable
Billyjoker
0

Este código es mejor

public static  byte[] getByteArrayFromImageView(ImageView imageView)
    {
        BitmapDrawable bitmapDrawable = ((BitmapDrawable) imageView.getDrawable());
        Bitmap bitmap;
        if(bitmapDrawable==null){
            imageView.buildDrawingCache();
            bitmap = imageView.getDrawingCache();
            imageView.buildDrawingCache(false);
        }else
        {
            bitmap = bitmapDrawable .getBitmap();
        }
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        return stream.toByteArray();
    }
Ahmad Aghazadeh
fuente
¿Es imageView.getDrawable (); -> significa obtener la imagen de la carpeta dibujable? CMIIW .... @Ahmad
gumuruh
No. Puedes usar este código. Bitmap imagenAndroid = BitmapFactory.decodeResource(getResources(),R.drawable.jellybean_statue);
Ahmad Aghazadeh
-3

Otra forma de obtener un mapa de bits de una imagen es hacer esto:

Bitmap imagenAndroid = BitmapFactory.decodeResource(getResources(),R.drawable.jellybean_statue);
imageView.setImageBitmap(imagenAndroid);
Hermes Trismegisto
fuente
-10

prueba este código:

Bitmap bitmap;
bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();
Droid_Mechanic
fuente
66
¿Podría describir la mejora sobre la respuesta aceptada de @Arslan?
bummi
será mejor que expliques por qué tu respuesta resuelve su problema
Muhammed Refaat