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?
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
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.
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);
}
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 )
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 :)