Android中的图片压缩

Posted epmouse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中的图片压缩相关的知识,希望对你有一定的参考价值。

1、android中计算图片占用堆内存的kB大小跟图片本身的kB大小无关,而是根据图片的尺寸来计算的。

      比如一张 480*320大小的图片占用的堆内存大小为:

      480*320*4/1024=600kB  之所以要乘以4,是因为在android中使用的ARGB图片,图片一个像素占用四个字节。

2、手机出厂时 堆内存(Heap)是固定的,所以为了不造成OOM,我们就需要生成bitmap时对图片进行压缩处理。

         实际使用中我们压缩图片的标准是手机屏幕大小作为参照的,这个主要是因为,即便是图片尺寸跟屏幕尺寸相同,换算出来所占的内存大小也要远小于手机堆存。

         为了讲解方便,我们就以 480*320大小的手机为例,图片压缩为同手机屏幕同尺寸时,所占的大小为 600kb,也就是0.6M,而480*320的手机的出厂heap一般是16M,这个数字根据每个厂商有所差异。

3、压缩方式:通过bitmap的options

       首先大家要知道,当图片太大造成加载时,报OOM异常是在哪个地方报的?

       打印测试知道是在:Bitmap bitmap =  BitmapFactory.decodeFile(url)这行就报错。所以我们的处理如下:

        

 1         //获取屏幕尺寸
 2         int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
 3         int screenHeight =getWindowManager().getDefaultDisplay().getHeight();
 4          //获取屏幕尺寸的方式二:支持13以上版本,就是使用point存储宽高,然后再取出来。
 5 //           Point point=new Point();
 6 //        getWindowManager().getDefaultDisplay().getSize(point);
 7 //        screenWidth=point.x;
 8 //        screenHeight=point.y;
 9               
10         BitmapFactory.Options opts= new BitmapFactory.Options();
11         opts.inJustDecodeBounds = true;//设置为true的目的,拿到图片的一些附属信息,而不真正加载图片
12         BitmapFactory.decodeFile(photoPath,opts);
13         //获取图片的尺寸
14         int imgWidth=opts.outWidth;
15         int imgHeight=opts.outHeight;
16         //根据比较大小选择缩放方式
17         opts.inSampleSize=imgWidth/screenWidth>imgHeight/screenHeight?imgWidth/screenWidth:imgHeight/screenHeight;
18         opts.inJustDecodeBounds = false;//允许加载图片
19         Bitmap mImage = BitmapFactory.decodeFile(photoPath, opts);//进行压缩比例加载图片
20         ByteArrayOutputStream baos = new ByteArrayOutputStream();
21 
22         image.setImageBitmap(mImage);

 总结:

     

##缩放加载大图片
1.获取你想显示的图片应该有的大小,如果是全屏,就获取屏幕大小

2.获取图片的原始大小,不将图片真正加载到内存,只拿到图片的附属信息
Options opts = new Options();
设置为true,不加在内存,只拿信息
opts.inJustDecodeBounds = true;
3.对图片做压缩处理,压缩的前提是图片的大小大于你要显示的区域大小
按照宽或者高的比例进行计算,选择比例大的那个进行压缩
压缩的比例值最后复制给
opts.inSampleSize = scale;
4.比例设置完之后,这时候才是真正的去加载图片到内存当中
opts.inJustDecodeBounds = false;
5.最后一部才是加载图片
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg", opts);

我们做这么多操作的最终目的其实就是为了要opts.inSampleSize = scale这个值。

以上是关于Android中的图片压缩的主要内容,如果未能解决你的问题,请参考以下文章

Android使用IconFont显示图片,从而缩小体积

Android性能优化之图片压缩优化

Android - 应用程序启动时片段 onCreate 崩溃

android 图片质量压缩和尺寸压缩有啥区别

android 如何压缩png图片字节数

一键解决Android项目图片压缩烦恼,为apk瘦身!