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?


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();

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);

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();

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

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();
    }

¿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);

-10

prueba este código:

Bitmap bitmap;
bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.