Android,Java,创建保持纵横比的缩略图

5

我想创建一个指定高度的缩略图,但要保持图片的宽高比。我使用了下面的代码,但是当图片比较小的时候,生成的缩略图可能无法填满缩略图区域。imageURI只是图片的路径。

            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(imageURI, o);
            final int REQUIRED_SIZE=70;

            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=4;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale++;
            }

            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;   
            Bitmap bitmap = BitmapFactory.decodeFile(imageURI, o2);
1个回答

3

您的代码将位图缩放至宽度或高度的至少1/4。如果原始图像已足够大,则会更小。

我猜您在ImageView中显示图像(您的缩略图区域?)。 如果图像未填充ImageView,则必须配置ImageView以正确调整图像大小。 如果您的ImageView和要显示的图像具有不同的纵横比,则使图像填充ImageView的唯一方法是扭曲图像。

我的做法:我使用BitmapFactory将图像解码为比缩略图要大,但几乎是我想要的尺寸。 最好使用2的幂作为缩放参数,因此我这样做。 然后,我设置ImageView的android:scaleType参数以按我喜欢的方式显示图像:

public static Bitmap decodeBitmap(Uri bitmapUri, ContentResolver resolver, int width, int height) throws IOException{
    InputStream is = resolver.openInputStream(bitmapUri);
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;      
    BitmapFactory.decodeStream(is,null,options);
    is.close();

    int ratio = Math.min(options.outWidth/width, options.outHeight/height);
    int sampleSize = Integer.highestOneBit((int)Math.floor(ratio));
    if(sampleSize == 0){
        sampleSize = 1;
    }       
    Log.d(RSBLBitmapFactory.class, "Sample Size: " + sampleSize);

    options = new BitmapFactory.Options();
    options.inSampleSize = sampleSize;

    is = resolver.openInputStream(bitmapUri);
    Bitmap b = BitmapFactory.decodeStream(is,null,options);
    is.close();
    return b;
}

<ImageView android:scaleType="fitXY"></ImageView>

作为对优秀答案的小补充,您还可以查看Android Developers关于内存中位图处理的专门文章 - Dr1Ku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接