Comment obtenir Bitmap à partir d'une Uri?

comment obtenir un objet Bitmap d'un Uri (si je réussis à le stocker dans /data/data/MYFOLDER/myimage.png ou file///data/data/MYFOLDER/myimage.png ) pour l'utiliser dans ma demande?

est-ce que quelqu'un a une idée sur la façon d'accomplir ceci?

158
demandé sur Jonik 2010-10-07 12:43:41

12 réponses

. . IMPORTANT: voir la réponse de @Mark Ingram ci-dessous et @pjv pour une meilleure solution. . .

Vous pouvez essayer ceci:

public Bitmap loadBitmap(String url)
{
    Bitmap bm = null;
    InputStream is = null;
    BufferedInputStream bis = null;
    try 
    {
        URLConnection conn = new URL(url).openConnection();
        conn.connect();
        is = conn.getInputStream();
        bis = new BufferedInputStream(is, 8192);
        bm = BitmapFactory.decodeStream(bis);
    }
    catch (Exception e) 
    {
        e.printStackTrace();
    }
    finally {
        if (bis != null) 
        {
            try 
            {
                bis.close();
            }
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
        if (is != null) 
        {
            try 
            {
                is.close();
            }
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    }
    return bm;
}

mais rappelez-vous, cette méthode ne doit être appelée que de l'intérieur d'un thread (pas GUI-thread). J'ai un AsyncTask.

-21
répondu Vidar Vestnes 2014-02-28 11:22:29

Voici la bonne façon de le faire:

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 vous avez besoin de charger de très grandes images, le code suivant le chargera dans les tuiles (en évitant de grandes allocations de mémoire):

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

voir la réponse ici

454
répondu Mark Ingram 2017-05-23 12:03:09

Voici la bonne façon de le faire, en gardant des onglets sur l'utilisation de la mémoire aussi bien:

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

l'appel getBitmap() du post de Mark Ingram appelle aussi le decodeStream(), donc vous ne perdez aucune fonctionnalité.

, les Références:

100
répondu pjv 2017-05-23 11:33:26
try
{
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
catch (Exception e) 
{
    //handle exception
}

et oui chemin doit être dans un format de ce genre

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

31
répondu Dhananjay 2016-01-21 04:48:25
 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();
        }
    }
8
répondu DeltaCap 2015-08-27 15:12:29

vous pouvez récupérer bitmap d'uri comme ceci

Bitmap bitmap = null;
try {
    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
} catch (IOException e) {
    e.printStackTrace();
}
6
répondu Emre AYDIN 2018-04-27 06:50:04

la solution est trop facile:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
5
répondu Hasib Akter 2018-05-28 17:26:14

utiliser l'activitépour lesmétodesrésultats comme ci-dessous

        startActivityForResult(new Intent(Intent.ACTION_PICK).setType("image/*"), PICK_IMAGE);

et vous pouvez obtenir le résultat comme ceci:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) {
        return;
    }
    switch (requestCode) {
        case PICK_IMAGE:
            Uri imageUri = data.getData();
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
            } catch (IOException e) {
                e.printStackTrace();
            }
         break;
    }
}
2
répondu Faxriddin Abdullayev 2017-07-11 10:28:41
Uri imgUri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imgUri);
2
répondu Ahmed Sayed 2018-08-02 11:01:55

vous pouvez faire cette structure:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    switch(requestCode) {
        case 0:
            if(resultCode == RESULT_OK){
                    Uri selectedImage = imageReturnedIntent.getData();
                    Bundle extras = imageReturnedIntent.getExtras();
                    bitmap = extras.getParcelable("data");
            }
            break;
   }

par ceci vous pouvez facilement convertir un uri en bitmap. l'espoir de l'aide de l'u.

1
répondu Sayed Mohammad Amin Emrani 2017-06-20 15:16:15

méthode complète pour obtenir l'uri d'image de la galerie mobile.....

protected void onActivityResult (int requestCode, int resultCode, Intent data) { super.onActivityResult (requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
            Uri filePath = data.getData();

                try {
                    //Getting the Bitmap from Gallery
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                    rbitmap = getResizedBitmap(bitmap, 250);//Setting the Bitmap to ImageView
                    userImage = getStringImage(rbitmap);
                    imageViewUserImage.setImageBitmap(rbitmap);
                } catch (IOException e) {
                    e.printStackTrace();
                }


        }

}

1
répondu Zzmilanzz Zzmadubashazz 2017-11-25 14:06:01

Bitmap imgbitmap = MediaStore.Image.Média.getBitmap (ceci.getContentResolver (), selectedImageUri);

1
répondu Shubham Ratawa 2018-03-28 11:51:13