2011-12-05 9 views
15

Powiedzmy, że mam magazyn obrazów na ścieżce "/mnt/images/abc.jpg". Jak uzyskać miniaturową mapę bitową generowaną przez system dla tego obrazu. Wiem jak zdobyć miniatury obrazu z jego Uri, ale nie z jego pliku ścieżceAndroid uzyskać miniaturkę obrazu zapisanego na sdcard, którego ścieżka jest znana

+1

Możesz po prostu utworzyć miniaturowe wideo i obraz za pomocą klasy ThumnailUtil java Rozmiar bitmapy zmieniony = ThumbnailUtils.extractThumbnail (BitmapFactory.decodeFile (file.getPath()), szerokość, wysokość); –

Odpowiedz

4

można uzyskać Uri z pliku jak poniżej:

Uri uri = Uri.fromFile(new File("/mnt/images/abc.jpg")); 
Bitmap thumbnail = getPreview(uri); 

A po function daje miniatur:

Bitmap getPreview(Uri uri) { 
    File image = new File(uri.getPath()); 

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

Myślę, że przy użyciu 'MediaStore.Images.Thumbnails.getThumbnail (getContentResolver(), Long.parseLong (_imageUri.getLastPathSegment()), typu, null);' byłoby lepszym rozwiązaniem, ponieważ system większość czasu buforuje miniatury – pankajagarwal

+0

@frieza Zgadzam się. – Caner

+1

Twoja metoda uzyskiwania URI nie wydaje się działać poprawnie, ponieważ dla pliku o ścieżce "/ mnt/sdcard/2011-12-02 11.22.50.jpg" rzeczywista nazwa użytkownika to: // media/external/images/media/556 gdzie jako metoda Uri.fromFile (...) zwraca plik: ///mnt/sdcard/2011-12-02%2011.22.50.jpg – pankajagarwal

21

można spróbować z tym:

public static Bitmap getThumbnail(ContentResolver cr, String path) throws Exception { 

    Cursor ca = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.MediaColumns._ID }, MediaStore.MediaColumns.DATA + "=?", new String[] {path}, null); 
    if (ca != null && ca.moveToFirst()) { 
     int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID)); 
     ca.close(); 
     return MediaStore.Images.Thumbnails.getThumbnail(cr, id, MediaStore.Images.Thumbnails.MICRO_KIND, null); 
    } 

    ca.close(); 
    return null; 

} 
+1

Dziękuję, działa idealnie – lukas

+0

dziękuję, proszę pana! i oczywiste, ale ktoś może tego potrzebować, jeśli chcesz wyświetlać większe obrazy, użyj MediaStore.Images.Thumbnails.MINI_KIND – keybee

+0

Najlepsze rozwiązanie, które znalazłem.Dziękuję bardzo, to powinna być akceptowana odpowiedź. – Tunerx

4

To może być alternatywne sposoby jak inne już wspomniano w swojej odpowiedzi, ale łatwy sposób znalazłem, aby uzyskać miniaturę korzysta ExifInterface

ExifInterface exif = new ExifInterface(pictureFile.getPath()); 
    byte[] imageData=exif.getThumbnail(); 
    if (imageData!=null) //it can not able to get the thumbnail for very small images , so better to check null 
    Bitmap thumbnail= BitmapFactory.decodeByteArray(imageData,0,imageData.length); 
+0

W niektórych przypadkach nie jest to praca. Nie lepsze niż uzyskiwanie z Image Store, jak w zaakceptowanej odpowiedzi. –

+0

Yaa, gdy BitmapFactory nie będzie w stanie dekodować tablicy bajtów tylko wtedy. – dhams

1

można po prostu stworzyć film miniatury i obrazu za pomocą ThumnailUtil klasę java

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


public static Bitmap createVideoThumbnail (String filePath, int kind) 

Dodano na poziomie interfejsu API 8 Utwórz miniaturę filmu wideo. Może zwrócić wartość null, jeśli film jest uszkodzony lub format nie jest obsługiwany.

Parametry filePath ścieżka pliku wideo rodzaju może być MINI_KIND lub MICRO_KIND

For more Source code of Thumbnail Util class

Developer.android.com

0

Użyj android klasa bitmapy i jego createScaledBitmap metoda.

metoda descroption:

public static Bitmap createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter) 

Przykład użycia:

Bitmap bitmap = BitmapFactory.decodeFile(img_path); 
int origWidth = bitmap.getWidth(); 
int origHeight = bitmap.getHeight(); 
bitmap = Bitmap.createScaledBitmap(bitmap, origWidth/10, origHeight/10, false); 

spadek plik źródłowy tak, jak chcesz. W moim przykładzie zmniejszyłem go 10 razy.

Powiązane problemy