2011-02-06 6 views

risposta

5

Questo codice farà il lavoro:

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

Si consiglia di calcolare la potenza più vicina 2 da utilizzare per inSampleSize, perché it's said per essere più veloce.

+4

ciò che è Dimensione miniatura –

+1

Il file costruttore (Uri) non è definito – hasanghaforian

+0

una potenza di 2 per inSampleSize non più veloce, ma è richiesto dall'algoritmo. Nota che le immagini possono essere molto più lager di THUMBNAIL_SIZE perché se per esempio 'inSampleSize = originalSize/THUMBNAIL_SIZE' è 7,' inSampleSize' sarà arrotondato per difetto a 4 dandoti una dimensione di originalSize/4, che è 1,75 volte la dimensione aspettati per dimensione, ovvero 3 volte i pixel. Questo effetto aumenta rapidamente per le taglie di campionamento più grandi –

2

Credo che questo codice è il modo più veloce per generare miniature da file su scheda 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 la scala è scaduta, è 2 (scala 1). In Java: (int) Maths.pow (2, (double) (scale-1)) –

+0

Grazie! Modificato. –

+1

Penso che hai infranto questo codice nella tua modifica, sta usando la scala nel suo stesso compito. Inoltre non esiste un pacchetto come "Matematica". –

9

Si può semplicemente creare miniatura del video e di immagine utilizzando la classe ThumnailUtil di java

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


public static Bitmap createVideoThumbnail (String filePath, int kind) 

Aggiunto in API livello 8 Crea una miniatura del video per un video. Può restituire null se il video è corrotto o il formato non è supportato.

Parametri filePath il percorso del file video tipo potrebbero essere MINI_KIND o MICRO_KIND

For more Source code of Thumbnail Util class

Developer.android.com

0

Alcuni cercando di non ho potuto ottenere il percorso delle miniature di immagini da SD. ho risolto questo problema ottenendo un bitmap di immagine Android, prima di creare una visualizzazione di immagine nell'adattatore per gridview (o dove necessario). Così ho chiamare il metodo 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; 
} 

È possibile ottenere ID immagine dal tuo SD utilizzando questa guida (Get list of photo galleries on Android)

0

Se ti piace HQ miniature, in modo da utilizzare [RapidDecoder] [1] biblioteca. E 'semplice come segue:

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

Non dimenticare di usare decoder incorporato, se si vuole ridimensionare meno del 50% e un risultato HQ. ho provato in API Livello 8 :)