245 votes

Obtenir Bitmap à partir d’un Uri [android]

Comment obtenir objet bitmap à partir d’un Uri (supposons que, si je réussis pour la stocker dans ou j’ai utilisé les deux chemins) à utiliser dans mon application

mais je suis pas à obtenir ce retour. Quelqu'un a-t-il une idée sur la façon d’y parvenir ?

611voto

Mark Ingram Points 24995

Voici la façon correcte de le faire :

Si vous avez besoin de charger des images très volumineuses, le code suivant dans chargera en tuiles (en évitant les allocations de mémoire grand) :

Voir la réponse ici :
http://stackoverflow.com/a/5089350/986

122voto

pjv Points 4527

Voici la bonne façon de le faire, garder un œil sur l'utilisation de la mémoire ainsi:

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

Le getBitmap() appel de Mark Ingram post appelle également la decodeStream(), de sorte que vous ne perdez pas la fonctionnalité.

Références:

48voto

Crazy Points 599
try
{
    Bitmap bitmap = MediaStrore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
catch (Exception e) 
{
 // handle exception
}   



                                    " 

-30voto

Vidar Vestnes Points 14317

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

Vous pouvez essayer ceci :

Mais n’oubliez pas, cette méthode doit uniquement être appelée dans un thread (pas de GUI-thread). J’ai une AsyncTask.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X