从资源中缩小位图,具有良好的质量和内存效率

时间:2013-01-07 16:10:29

标签: android resources bitmap scale

我想缩小500x500px资源以适应始终由屏幕宽度决定的特定大小。

目前我使用Android开发者网站(Loading Large Bitmaps Efficiently)中的代码,但质量不如我在ImageView中使用500x500px资源(作为xml中的源代码)那么好缩放ImageView而不是位图。

但它很慢,我也想扩展Bitmap,以提高内存效率。

编辑:我想缩放的drawable在我的应用程序的drawable文件夹中。

Edit2:我目前的方法。

enter image description here

左图是来自Loading Large Bitmaps Efficiently的方法,没有任何修改。中心图像由@Salman Zaidi提供的方法完成,只需稍加修改:o.inPreferredConfig = Config.ARGB_8888;o2.inPreferredConfig = Config.ARGB_8888;

右图是一个图像视图,其中图像源以xml定义,并且我想用缩放的位图来达到质量。

3 个答案:

答案 0 :(得分:6)

private Bitmap decodeImage(File f) {
    Bitmap b = null;
    try {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        FileInputStream fis = new FileInputStream(f);
        BitmapFactory.decodeStream(fis, null, o);
        fis.close();

        float sc = 0.0f;
        int scale = 1;
        //if image height is greater than width
        if (o.outHeight > o.outWidth) {
            sc = o.outHeight / 400;
            scale = Math.round(sc);
        } 
        //if image width is greater than height
        else {
            sc = o.outWidth / 400;
            scale = Math.round(sc);
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        fis = new FileInputStream(f);
        b = BitmapFactory.decodeStream(fis, null, o2);
        fis.close();
    } catch (IOException e) {
    }
    return b;
}

此处'400'是新宽度(如果图像处于纵向模式)或新高度(如果图像处于横向模式)。您可以设置自己选择的值。缩放位图不会占用太多内存空间..

答案 1 :(得分:3)

Dudes, inSampleSize param用于内存优化,同时从资源或内存加载位图。因此,对于您的问题,您应该使用此:

Bitmap bmp = BitmapFactory.decode...;
bmp = bmp.createScaledBitmap(bmp, 400, 400, false);

inSampleSizelets 可让您使用descret步骤缩放位图。比例比为2,4,依此类推。因此,当您使用选项解码时, inSampleSize = 2 ,您从内存加载250x250位图,然后将其拉伸到400x400

答案 2 :(得分:0)

检查此培训:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

它展示了如何有效地调整位图的大小