2011-02-06 21 views

Respuesta

5

Este código hará el trabajo:

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

Es posible que desee para calcular la potencia más cercana de 2 a utilizar para inSampleSize, porque it's said a ser más rápido.

+4

lo que es miniatura de tamaño del archivo –

+1

El constructor (Uri) no está definido – hasanghaforian

+0

una potencia de 2 para inSampleSize no más rápido, pero requiere es por el algoritmo. Tenga en cuenta que las imágenes pueden ser mucho más largas que THUMBNAIL_SIZE porque si, por ejemplo, 'inSampleSize = originalSize/THUMBNAIL_SIZE' es 7,' inSampleSize' se redondeará a 4, lo que le da un tamaño de originalSize/4, que es 1,75 veces el tamaño esperar por dimensión, es decir, 3 veces los píxeles. Este efecto aumenta rápidamente para tamaños de muestreo más grandes –

2

Creo que este código es la forma más rápida de generar miniaturas de archivos en la tarjeta 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 su escala no está subestimada, es 2 (escala-1). En Java: (int) Maths.pow (2, (double) (scale-1)) –

+0

¡Gracias! Editado –

+1

Creo que rompiste este código en tu edición, está usando la escala en su propia tarea. Además, no existe un paquete como "Matemáticas". –

9

Usted puede simplemente crear miniatura de vídeo y la imagen usando la clase ThumnailUtil de java

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


public static Bitmap createVideoThumbnail (String filePath, int kind) 

Agregado en la API nivel 8 Crea una miniatura de video para un video. Puede devolver nulo si el video está dañado o el formato no es compatible.

Parámetros rutaArchivo la ruta del archivo de vídeo tipo podría MINI_KIND o MICRO_KIND

For more Source code of Thumbnail Util class

Developer.android.com

0

Algunos tratando que no podía obtener la ruta de la imagen en miniatura de la SD. Estoy resuelto este problema al obtener un mapa de bits de la imagen de Android, antes de crear una vista de imagen en el adaptador para gridview (o donde lo necesite). Así que llamar al método 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; 
} 

Puede obtener ID de imagen de su SD usando esta guía (Get list of photo galleries on Android)

0

Si como HQ miniaturas, así que utilice [RapidDecoder] [1] biblioteca. Es simple de la siguiente manera:

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

No se olvide de utilizar decodificador incorporado si desea reducir proporcionalmente inferior al 50% y un resultado HQ. he comprobado en el API de nivel 8 :)

Cuestiones relacionadas