Android: получить миниатюру изображения на SD-карте, учитывая Uri исходного изображения - PullRequest
11 голосов
/ 07 февраля 2011

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

Ответы [ 5 ]

9 голосов
/ 01 апреля 2015

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

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


 public static Bitmap createVideoThumbnail (String filePath, int kind)

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

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

Для получения дополнительной информации Исходный код Thumbnail Utilкласс

Developer.android.com

6 голосов
/ 07 февраля 2011

Этот код сделает работу:

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, потому что говорят, что быстрее.

2 голосов
/ 24 июня 2012

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

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

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

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

0 голосов
/ 02 ноября 2015

Несколько попыток мне не удалось получить путь к уменьшенному изображению с 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 )

...