Android开发-图片压缩

来源:互联网 发布:橱柜画图软件 编辑:程序博客网 时间:2024/05/12 21:31

手机照片的像素一般都远远大于手机的屏幕大小。所以为了节省资源,防止oom异常,我们需要在显示之前,做一些压缩处理。不过网上加载图片的库有很多,ImageLoder,Glide等,有一篇对它们进行比较的文章,大家有兴趣可以看一下:

http://www.trinea.cn/android/android-image-cache-compare/

这篇文章仅仅是压缩显示图片,如果想要运用到项目中,还是推荐大家使用得到大多程序员认可的开源库,如果想简单了解下原理,可以看下这篇文章,里面也有讲到屏幕dpi的问题。

一、获取图片参数

    直接获取Bitmap对象会获取原图,这不是我们想要的。BitmapFactory.Options中将 inJustDecodeBounds设置为true,则会开启预读取功能,它的功能是获取将要读取的Bitmap空对象,但是这个对象有这个图片的一系列参数,并且这个时候,我们并没有真正地加载该图片,所以不会产生OOM异常。简单来说:该技术允许你在生成Bitmap对象前对其进行压缩。

  1. BitmapFactory.Options options = new BitmapFactory.Options();
  2. //开启预加载功能
  3. options.inJustDecodeBounds = true;
  4. //将要加载的图片参数传递给options
  5. BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
  6. //获取图片的参数
  7. int imageHeight = options.outHeight;
  8. int imageWidth = options.outWidth;
  9. String imageType = options.outMimeType;

为了避免OOM异常,在真正解析图片之前检查它的尺寸是非常有必要的。

二、显示图片

    现在我们有了即将加载的图片的一系列参数,那我们接下来要做的,就是进行评估:

        1、屏幕大小与当前设备的密度

        2、呈现这张图片的控件大小

    根据以上条件,我们要最合适地对图片进行压缩,为了告诉解码器去加载一个缩小版的图片,我们可以设置BitmapFactory.Options

    的inSampleSize的值。比如一张2048x2048的图片,如果将inSampleSize设为2,则图片大小就会变为1024x1024。设为4,就会变成512x512的,需要注意的是,这个值,必须是平方增长,1、2、4、8、16、24、32、40等,如果不是这些数值,系统也会将你设置的数值四舍五入到最近的数值。细心的人发现了,你提莫在逗我?明明平方增长,怎么会有24、40呢?没错,从16倍之后,每8倍都可以设置一次,而无需遵循平方增长,详细可查看源码,我也是在自己的demo中发现,16之后明明是32,结果在24的时候缩小了四分之一,一切都是我一个人在测试,具体缩小多少倍,大家可以根据自己需求,多次运行调试,最后决定。



知道了这个之后,还有一个非常要注意的地方,就是读取本地的图片,存放的文件夹。拿Genymotion虚拟机2560x1440,Android6.0为例,它屏幕的dpi为xxxhdpi,首先,我将一张640x640的图片放到了mipmap-mdpi中然后不压缩将这张图片加载出来,然后显示出图片的宽高,结果是这样的:


!!!!,等等,怎么会这么大,ImageView为warp_content,最大也应该是640x640呀。

这个就是老话题了:

dpi对应问题

如果不了解dpi概念的小伙伴,可以去看下这片文章,如果了解的话请无视

http://www.zcool.com.cn/article/ZNjI3NDQ=.html

现在为把这张图片放到xxxhdpi文件夹下

然后,加载出来


铛铛铛铛,就是640x640了,所以加载本地图片的话一定要注意,还有dpi的影响在,至于dpi的对应表,我简单写一下

所有的比例,都是根据mdpi来进行换算,如果高级别的dpi想换算成更高级别的dpi,需要先*(高级别dpi比例/更高级别dpi比例)

 ldpimdpihdpixhdpixxhdpixxxhdpi    0.7511.5234   dpi范围<120120-159160-239240-320321-479480-640   

dpi如何计算?根据屏幕分辨率勾股定理算出对角线分辨率长度,然后除以屏幕尺寸。得出的就是dpi了。

好了,至此,屏幕密度的问题,就结束了。接下来就要可以自己考虑控件大小,然后对图片进行压缩了。压缩多少,可根据自己的需求决定。










0 0
原创粉丝点击