J'ai donc un Uri d'une image que l'utilisateur choisit parmi les images de sa carte SD. Et j'aimerais afficher une vignette de cette image car, de toute évidence, l'image pourrait être énorme et occuper tout l'écran. Quelqu'un sait comment?
Vous pouvez simplement créer une vidéo et une image miniatures à l'aide de la classe Java ThumnailUtil
Bitmap resized = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(file.getPath()), width, height);
public static Bitmap createVideoThumbnail (String filePath, int kind)
Ajouté dans l’API niveau 8 Créer une miniature de vidéo pour une vidéo. Peut renvoyer la valeur null si la vidéo est corrompue ou si le format n'est pas pris en charge.
Paramètres FilePath Le chemin du fichier vidéo Peut être de type MINI_KIND ou MICRO_KIND.
Ce code fera le travail:
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 voudrez peut-être calculer la puissance de 2 la plus proche à utiliser pour inSampleSize
, car on dit pour être plus rapide.
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);
}
Si vous aimez les vignettes HQ, utilisez donc la bibliothèque [RapidDecoder] [1]. C'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 intégré si vous souhaitez réduire le résultat à moins de 50% et obtenir un résultat HQ. Je l'ai testé dans l'API de niveau 8 :)
En essayant quelques-uns, je ne pouvais pas obtenir le chemin de vignette de l’image de SD. Je suis résolu à ce problème d’obtenir une image bitmap Android, avant de créer une vue d’image dans l’adaptateur pour gridview (ou là 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;
}
Ce guide vous permet d’obtenir l’ID d’image de votre carte SD ( Obtenir la liste des galeries de photos sur Android )