Android,Java,创建缩略图保持宽高比

Pau*_*aul 5 java android imageview

我正在尝试创建一定高度的缩略图,但保持纵横比.我正在使用下面的代码但问题出现时,如果图像有点小,生成的图像将不会填充缩略图区域.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);
Run Code Online (Sandbox Code Playgroud)

tha*_*sma 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>
Run Code Online (Sandbox Code Playgroud)