Android: получить снимок изображения на SD-карте, учитывая Uri оригинального изображения

Итак, у меня есть Uri изображения, которое пользователь выбирает из изображений с его SD-карты. И я хотел бы показать эскиз этого изображения, потому что, очевидно, изображение может быть огромным и охватывать весь экран. Кто-нибудь знает как?

Solutions Collecting From Web of "Android: получить снимок изображения на SD-карте, учитывая Uri оригинального изображения"

Вы можете просто создать эскиз видео и изображение, используя класс javascript класса ThumnailUtil

Bitmap resized = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(file.getPath()), width, height); public static Bitmap createVideoThumbnail (String filePath, int kind) 

Добавлено в уровень API 8 Создайте миниатюру видео для видео. Может возвращать null, если видео повреждено или формат не поддерживается.

Параметры filePath путь к типу видеофайла может быть MINI_KIND или MICRO_KIND

Дополнительные сведения о исходном коде класса Thumbnail Util

Developer.android.com

Этот код выполнит эту задачу:

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

Вы можете вычислить ближайшую мощность 2, чтобы использовать для inSampleSize , потому что говорят , что она быстрее.

Я считаю, что этот код является самым быстрым способом генерации эскиза из файла на 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); } 

Несколько попыток я не смог получить путь эскизов изображения к SD. Я решил эту проблему получить растровое изображение изображения Android, прежде чем создать представление изображения в адаптере для gridview (или где вам нужно). Поэтому я вызываю метод 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; } 

Вы можете получить идентификатор изображения с SD, используя это руководство ( Получить список фотогалерей на Android )

Если вам нравятся миниатюры HQ, используйте библиотеку [RapidDecoder] [1]. Это просто:

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

Не забудьте использовать встроенный декодер, если вы хотите уменьшить масштаб менее 50% и результат HQ. Я тестировал его на уровне API 8: