¿Cómo obtener un mapa de bits de un Uri?

Resuelto ilredelweb asked hace 54 años • 0 respuestas

¿Cómo obtener un objeto Bitmap de un Uri (si logro almacenarlo en /data/data/MYFOLDER/myimage.pngo file///data/data/MYFOLDER/myimage.png) para usarlo en mi aplicación?

¿Alguien tiene una idea sobre cómo lograr esto?

ilredelweb avatar Jan 01 '70 08:01 ilredelweb
Aceptado

Esta es la forma correcta de hacerlo:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK)
    {
        Uri imageUri = data.getData();
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
    }
}

Si necesita cargar imágenes muy grandes, el siguiente código las cargará en mosaicos (evitando grandes asignaciones de memoria):

BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false);  
Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null);

Vea la respuesta aquí

Mark Ingram avatar Jan 17 '2011 20:01 Mark Ingram

Esta es la forma correcta de hacerlo, controlando también el uso de la memoria:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
  super.onActivityResult(requestCode, resultCode, data);
  if (resultCode == RESULT_OK)
  {
    Uri imageUri = data.getData();
    Bitmap bitmap = getThumbnail(imageUri);
  }
}

public static Bitmap getThumbnail(Uri uri) throws FileNotFoundException, IOException{
  InputStream input = this.getContentResolver().openInputStream(uri);

  BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
  onlyBoundsOptions.inJustDecodeBounds = true;
  onlyBoundsOptions.inDither=true;//optional
  onlyBoundsOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
  BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
  input.close();

  if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) {
    return null;
  }

  int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth;

  double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0;

  BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
  bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
  bitmapOptions.inDither = true; //optional
  bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//
  input = this.getContentResolver().openInputStream(uri);
  Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
  input.close();
  return bitmap;
}

private static int getPowerOfTwoForSampleRatio(double ratio){
  int k = Integer.highestOneBit((int)Math.floor(ratio));
  if(k==0) return 1;
  else return k;
}

La llamada getBitmap() de la publicación de Mark Ingram también llama a decodeStream(), por lo que no pierde ninguna funcionalidad.

Referencias:

  • Android: obtenga una miniatura de la imagen en la tarjeta SD, teniendo en cuenta el Uri de la imagen original

  • Manejo de mapas de bits grandes

pjv avatar Jun 03 '2011 14:06 pjv
try
{
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
catch (Exception e) 
{
    //handle exception
}

y sí, la ruta debe tener un formato como este

file:///mnt/sdcard/filename.jpg

DjP avatar Sep 13 '2013 11:09 DjP
private void uriToBitmap(Uri selectedFileUri) {
    try {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().openFileDescriptor(selectedFileUri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);

        parcelFileDescriptor.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
abhinavrathore019 avatar Aug 27 '2015 15:08 abhinavrathore019

Esta es la solución más sencilla:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
Sheikh Hasib avatar May 28 '2018 17:05 Sheikh Hasib