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对象前对其进行压缩。
BitmapFactory.Options options = new BitmapFactory.Options();
//开启预加载功能
options.inJustDecodeBounds = true;
//将要加载的图片参数传递给options
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
//获取图片的参数
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
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比例)
dpi如何计算?根据屏幕分辨率勾股定理算出对角线分辨率长度,然后除以屏幕尺寸。得出的就是dpi了。
好了,至此,屏幕密度的问题,就结束了。接下来就要可以自己考虑控件大小,然后对图片进行压缩了。压缩多少,可根据自己的需求决定。
- Android开发-图片压缩
- Android开发压缩图片
- Android 开发图片压缩(缩略图)方法
- Android 开发图片压缩/缩略图的方法
- Android 开发图片压缩/缩略图的方法
- Android 开发图片压缩/缩略图的方法
- Android 开发图片压缩/缩略图的方法
- Android 开发图片压缩/缩略图的方法
- Android开发中图片的压缩处理
- Android开发 压缩保存图片至本地
- Android开发之---有关图片压缩
- Android 开发图片压缩/缩略图的方法
- iOS开发-图片压缩
- [IOS开发]图片压缩
- 开发日记(4)Android的图片压缩类ThumbnailUtils
- Android应用开发中三种常见的图片压缩方法
- Android应用开发中三种常见的图片压缩方法
- Android开发之--图片压缩的三种方式
- JS判断客户端是否是iOS或者Android
- 教你快速使用eclipse开发工具
- uboot主Makefile分析3
- mysql复制表结构,表数据
- Batch Normalization 学习笔记
- Android开发-图片压缩
- 安装PostgreSQL数据库(Linux篇)
- linux系统空间满了的处理办法(如何清理空间垃圾)
- BLE协议栈概述-host层
- Struts2 - 属性驱动与模型驱动
- json两种结构
- 0084:StreamingContext、DStream、Receiver深度剖析
- git 常用操作指令
- python连接数据库,tushare,Dataframe to sql