Android:获取原始图像的Uri,获取SD卡上的图像缩略图

时间:2011-02-06 21:13:05

标签: android image uri thumbnails

所以我得到了用户从SD卡中选择的图像的Uri图像。而且我想显示该图像的缩略图,因为很明显,图像可能很大并占据整个屏幕。谁知道怎么做?

6 个答案:

答案 0 :(得分:9)

您可以使用ThumnailUtil类java

创建缩略图视频和图像
Bitmap resized = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(file.getPath()), width, height);


 public static Bitmap createVideoThumbnail (String filePath, int kind)

在API级别8中添加 为视频创建视频缩略图。如果视频损坏或格式不受支持,可能会返回null。

参数 filePath视频文件的路径 kind可以是MINI_KIND或MICRO_KIND

For more Source code of Thumbnail Util class

Developer.android.com

答案 1 :(得分:6)

此代码可以完成这项工作:

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更快。

答案 2 :(得分: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);
}

答案 3 :(得分:0)

一些尝试我无法从SD获取图像的缩略图路径。 在我在gridview(或你需要的地方)的适配器中创建一个图像视图之前,我解决了这个获取android图像位图的问题。所以我称之为方法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;
}

您可以使用本指南(Get list of photo galleries on Android

从SD获取图片ID

答案 4 :(得分: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中进行了测试:)

答案 5 :(得分:0)

此软件包将使您可以访问图像URI,以接收图像大小,大的位图数据,将图像采样到任何较小的大小以节省内存并最大化性能。

它使用InputStream和BitmapFactory:

public int[] getImageSize(Uri uri){
    try {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        InputStream input = this.getContentResolver().openInputStream(uri);
        BitmapFactory.decodeStream(input, null, options); input.close();
        return new int[]{options.outWidth, options.outHeight};
    }
    catch (Exception e){}
    return new int[]{0,0};
}
public Bitmap BitmapImage(Uri uri){return BitmapImage(uri,-1,-1);}
public Bitmap BitmapImage(Uri uri, int maxSize){return BitmapImage(uri,maxSize,maxSize);}
public Bitmap BitmapImage(Uri uri, int Wmax, int Hmax){
    try {   
        InputStream input = this.getContentResolver().openInputStream(uri);
        double ratio=1;
        if ((Wmax>-1)&&(Hmax>-1)){
            int[] wh=getImageSize(uri); double w=wh[0], h=wh[1];
            if (w/Wmax>1){ratio=Wmax/w; if (h*ratio>Hmax){ratio=Hmax/h;}}
            else if (h/Hmax>1){ratio=Hmax/h;}
        }
        BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
        bitmapOptions.inSampleSize = (int)Math.ceil(1/ratio);
        bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;
        Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
        input.close();
        return bitmap;
    }
    catch (Exception e){}
    return null;
}

针对不同用例的四个功能:

/*
    getImageSize(Uri uri): return int[]{ width, height}
    BitmapImage(Uri uri): return Bitmap in full size
    BitmapImage(Uri uri, int maxSize): return sampled Bitmap which is limited in square size
    BitmapImage(Uri uri, int Wmax, int Hmax): return sampled Bitmap which is limited width and height
*/