Pregunta Android: obtenga una miniatura de la imagen en la tarjeta SD, dado Uri de la imagen original


Así que tengo una URI de una imagen que el usuario elige de las imágenes de su tarjeta SD. Y me gustaría mostrar una miniatura de esa imagen, porque obviamente, la imagen podría ser enorme y ocupar toda la pantalla. Alguien sabe como?


11
2018-02-06 21:13


origen


Respuestas:


Simplemente puede crear una imagen y video en miniatura 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 el nivel de API 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 filePath la ruta del archivo de video tipo podría ser MINI_KIND o MICRO_KIND

Para obtener más código fuente de la clase Util de miniaturas

Desarrollador.android.com


9
2018-04-01 05:26



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 calcular la potencia más cercana a 2 para usar para inSampleSize, porque está dicho para ser mas rapido


5
2018-02-06 22:44



Creo que este código es la manera más rápida de generar una miniatura desde el archivo 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);
}

2
2018-06-24 14:02



Unos pocos intentando que no pude obtener la ruta en miniatura de la imagen de 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 llamo 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 (Obtener una lista de galerías de fotos en Android)


0
2017-11-02 18:23



Si te gustan las miniaturas HQ, usa la biblioteca [RapidDecoder] [1]. Es simple como sigue:

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

No te olvides de usar el decodificador incorporado si deseas reducir la escala a menos del 50% y un resultado HQ. Lo probé en API Nivel 8 :)


0
2017-08-25 11:37