Android: obtenir la vignette de l'image sur la carte SD, étant donné Uri de l'image originale

donc j'ai une Uri d'une image que l'utilisateur choisit parmi les images de sa carte SD. Et j'aimerais afficher une miniature de l'image, parce que, évidemment, l'image pourrait être énorme et prendre tout l'écran. Quelqu'un sait comment?

11
demandé sur Rahat Ahmed 2011-02-07 00:13:05

5 réponses

vous pouvez simplement créer des vignettes vidéo et image en utilisant la classe thumnailutil de java

Bitmap resized = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(file.getPath()), width, height);


 public static Bitmap createVideoThumbnail (String filePath, int kind)

ajouté dans le niveau API 8 Créer une vignette vidéo pour une vidéo. Peut retourner null si la vidéo est corrompue ou si le format n'est pas supporté.

paramètres filePath le chemin du fichier vidéo le genre peut être MINI_KIND ou MICRO_KIND

De plus le code Source de la Vignette Util classe

Developer.android.com

9
répondu sujith s 2015-04-01 05:26:39

ce code fera l'affaire:

Bitmap getPreview(URI uri) {
    File image = new File(uri);

    BitmapFactory.Options bounds = new BitmapFactory.Options();
    bounds.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(image.getPath(), bounds);
    if ((bounds.outWidth == -1) || (bounds.outHeight == -1))
        return null;

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

    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inSampleSize = originalSize / THUMBNAIL_SIZE;
    return BitmapFactory.decodeFile(image.getPath(), opts);     
}

vous pouvez vouloir calculer la puissance la plus proche de 2 à utiliser pour inSampleSize , parce que il est dit pour être plus rapide.

6
répondu Gubbel 2011-02-06 22:44:00

je crois que ce code est le moyen le plus rapide de générer une vignette à partir d'un fichier sur une carte SD:

 public static Bitmap decodeFile(String file, int size) {
    //Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(file, o);

    //Find the correct scale value. It should be the power of 2.
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = (int)Maths.pow(2, (double)(scale-1));
    while (true) {
        if (width_tmp / 2 < size || height_tmp / 2 < size) {
            break;
        }
        width_tmp /= 2;
        height_tmp /= 2;
        scale++;
    }

    //Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    return BitmapFactory.decodeFile(file, o2);
}
2
répondu David Vávra 2012-10-23 11:16:19

quelques essais je n'ai pas pu obtenir le chemin des vignettes de l'image du SD. je suis résolu ce problème obtenir une image android bitmap, avant de créer une vue d'image dans Adaptateur pour gridview (ou où vous avez besoin). Donc j'appelle la méthode imageView.setImageBitmap(someMethod(Context context, imageID))

Bitmap someMethod(Context context, long imageId){

    Bitmap bitmap =   Media.Images.Thumbnails.getThumbnail(context.getAplicationContext.getContentResolver(), imageid, MediaStore.Images.Thumbnails.MINI_KIND, null);
    return bitmap;
}

vous pouvez obtenir l'identification d'image de votre SD en utilisant ce guide ( obtenir la liste des galeries de photos sur Android )

0
répondu IHAFURR 2017-05-23 11:46:24

si vous aimez les vignettes HQ, alors utilisez la bibliothèque [RapidDecoder][1]. Il est simple comme suit:

import rapid.decoder.BitmapDecoder;
...
Bitmap bitmap = BitmapDecoder.from(getResources(), R.drawable.image)
                             .scale(width, height)
                             .useBuiltInDecoder(true)
                             .decode();

N'oubliez pas d'utiliser le décodeur builtin si vous voulez réduire l'échelle de moins de 50% et un résultat HQ. Je l'ai testé dans l'API de Niveau 8 :)

0
répondu S.M.Mousavi 2016-08-25 11:37:41