Android读取指定路径的位图(FR:徐海涛)

来源:互联网 发布:软件推广ppt 编辑:程序博客网 时间:2024/05/17 07:15
   public Bitmap revitionImageSize(String path)        throws IOException    {        BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path)));        BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true; //设置True只解码图片的Bounds        BitmapFactory.decodeStream(in, null, options);        in.close();        int i = 0;        Bitmap bitmap = null;        while (true)        {            if ((options.outWidth >> i <= 256) && (options.outHeight >> i <= 256))            {                in = new BufferedInputStream(new FileInputStream(new File(path)));                options.inSampleSize = (int)Math.pow(2.0D, i); //表示2的i次方                options.inJustDecodeBounds = false;                bitmap = BitmapFactory.decodeStream(in, null, options);                break;            }            i += 1;        }        return bitmap;    }

有些人会问 ,知道一个图片的SD卡保存路径,搞一个输入流,然后抽取数据,最后关闭流不就OK啦吗,为啥搞得这么复杂


其实主要原因是在:
BitmapFactory.decodeStream(Stringpath)方法返回Bitmap时,遇到大一点的图片,经常会遇到OOM(Out OfMemoery)


这里写图片描述


BitmapFactory.Options 类, 定义了以何种方式将图片读到内存


inJustDecodeBounds 如果设置为True,BitmapFactory.decodeStream就不会直接返回一个位图,而只是返回位图的宽和高,这样就不会占用太高的内存,具体的宽和高获取如下:

options.outWidth和options.outHeight


inSampleSize 可以根据实际的宽高和期望的宽高来计算这个值,如果inSampleSize = 8,那么图片就变成原来的1/8



FR:海涛高软(QQ技术交流群:386476712)

1 0