图片压缩,那些东西
在项目开发的过程中,我们可能或多或少的会操作图片,而一般来说,app涉及内存泄露或者apk体积增大,大部分原因都是图片的问题,或者图片尺寸比较大,或者一次加载的图片比较多等等。,所以个人认为,只要你想对app进行瘦身,缩小app大小,避免内存泄露等等,同时为了避免OOM内存泄露,几乎所有的app都会对大图进行压缩,这是毋庸置疑的,所以只要图片处理的好,可以说大部分问题都解决了,所以本文就对图片压缩的原因和常见的图片压缩方法做一个简单的总结。
文件和流的格式对图片的大小没有影响。也就是说,如果一个手机的SD卡是100k,那么以流的形式读取也是100k。如果图片以位图的形式存在,内存会瞬间增加。
文件格式:file.length()
流的形式:把图片文件读入内存输入流,看它的字节数;
Bitmap:bitmap.getByteCount()
如果图片要上传,那么几个m的大小肯定不行,必须压缩;
如果图片要在android设备上显示,ImageView最终会加载位图对象,所以需要考虑单个位图对象占用多少内存;
位图内存大小=图片长度*图片宽度*每个像素的字节数
位图有两种常见的编码方法,ARGB 8888和RGB——565。前者每像素4字节,后者2字节。ARGB_8888更常用。
1080 * 1920 * 4 = 7.9M
保持原图像长宽比的压缩,但图像变小,显示原图像的所有内容。使用BitmapFactory.options,通过选项设置缩放比例生成缩略图;
InSimpleSize(采样率):
优点:效率高,分析速度快;
缺点:inSimpleSize只能是2的幂,无法精确指定图片大小;
宽度和高度的比例可以不同。可以通过Bitmap.createBitmap()方法创建新的位图。这个位图可以选择图片的一部分,而不是整体压缩,类似于在QQ上上传一个头像,让你在图片上选择任意缩放形式,控制非常灵活。
意思是图片的大小和清晰度看起来和原图一样,但是尺寸缩小了。缩小的原理是牺牲其他不能直接看到的东西,比如分辨率,看起来和原图一样,但放大后马上就会失真,不像原图放大后才清晰。