2011-02-06 1 views
11

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

ответ

5

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

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, потому что it's said быстрее.

+4

что такое THUMBNAIL SIZE –

+1

Конструктор File (Uri) не определено – hasanghaforian

+0

степень 2 для inSampleSize не быстрее, но требуется алгоритмом. Обратите внимание, что изображения могут быть намного моложе, чем THUMBNAIL_SIZE, потому что, если, например, 'inSampleSize = originalSize/THUMBNAIL_SIZE' равно 7,' inSampleSize' будет округлено до 4, что даст вам размер оригиналаSize/4, что в 1,75 раза больше вашего размера ожидайте за измерение, т. е. в 3 раза больше пикселей. Этот эффект быстро увеличивается для больших размеров выборки. –

2

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

Destil: ваш вес недооценивается, это 2 (шкала-1). В Java: (int) Maths.pow (2, (double) (scale-1)) –

+0

Спасибо! Ред. –

+1

Я думаю, что вы нарушили этот код в своем редактировании, он использует масштаб в своем собственном задании. Также нет такого пакета, как «Maths». –

9

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

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


public static Bitmap createVideoThumbnail (String filePath, int kind) 

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

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

For more Source code of Thumbnail Util class

Developer.android.com

0

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

Вы можете получить ID изображения из вашей SD с помощью данного руководства (Get list of photo galleries on Android)

0

Если вам нравится 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 :)