Android 图片缩放 BitmapFactory详解

  1. 在把图片转化为bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。因此需要把图片进行缩放。
    BitmapFactory.Options类中的成员变量:
     - inJustDecodeBounds
     如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
     
     - inSampleSize
    通过options.outHeight和 options. outWidth获取的宽高和自己想要到得图片宽高计算出缩放比例-inSampleSize。该参数需要自己通过计算得到。

2.BitmapFactory.decodeFile(String path)
   该方法将图片转成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到图片的宽高了。
 
BitmapFactory.decodeFile(String path, Options options)
  inJustDecodeBounds为true时,该方法返回的bmp是null,可以在options.outWidth 和 options.outHeight得到图片的宽高
  inJustDecodeBounds为false时,返回bmp

decodeResource()
  可以将/res/drawable/内预先存入的图片转换成Bitmap对象
decodeStream()
  方法可以将InputStream对象转换成Bitmap对象。

图片缩放代码:

private Bitmap decodeThumbBitmapForFile(String path, int viewWidth, int viewHeight){
        BitmapFactory.Options options = new BitmapFactory.Options();
        //设置为true,表示解析Bitmap对象,该对象不占内存
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);
        //设置缩放比例
        options.inSampleSize = computeScale(options, viewWidth, viewHeight);

        //设置为false,解析Bitmap对象加入到内存中
        options.inJustDecodeBounds = false;


        Log.e(TAG, "get Iamge form file, path = " + path);
        //返回Bitmap对象
        return BitmapFactory.decodeFile(path, options);
    }

计算缩放比例:

private int computeScale(BitmapFactory.Options options, int viewWidth, int viewHeight){
        int inSampleSize = 1;
        if(viewWidth == 0 || viewWidth == 0){
            return inSampleSize;
        }
        int bitmapWidth = options.outWidth;
        int bitmapHeight = options.outHeight;

//假如Bitmap的宽度或高度大于我们设定图片的View的宽高,则计算缩放比例
        if(bitmapWidth > viewWidth || bitmapHeight > viewWidth){
            int widthScale = Math.round((float) bitmapWidth / (float) viewWidth);
            int heightScale = Math.round((float) bitmapHeight / (float) viewWidth);

    //为了保证图片不缩放变形,我们取宽高比例最小的那个
            inSampleSize = widthScale < heightScale ? widthScale : heightScale;
        }
        return inSampleSize;
    }

你可能感兴趣的:(android,图片,图片缩放)