从事安卓开发也有几年了,本人喜欢开门见山,此篇文章是处理以java语言下的安卓开发过程中图片压缩问题。
图片加载在我们的开发过程中都是一个内存大户,以至于我们加载每一个图片bitmap对象的时候都应该进行回收以减少内存的占用,而如果单张图片的大小加载在内存都会造成oom内存溢出,那么只是单纯的回收就没办法解决了。我们就会涉及到图片压缩。我总结了几种图片压缩的方式和图片占内存的形式,供大家参考。
有人说一张图片也就几mb,而手机内存有1G-8G,为什么会内存溢出呢?这就要从图片占用内存的形式说起了。
图片是由像素点组成的,我们常见的分辨率1920*1080,800*720,2560*1400等,其实就是指屏幕横向或者纵向有多少个像素点,正常手机上
如果图片像素密度过大,占用的内存也就会相应的大。图片也是一样。以尺寸 800*400为例,图片占用内存就是800*400*每个像素点占用的字节数。那么每个像素占用多少内存呢?这就涉及到图片像素的位图位数。
一般情况下我们只需考虑这四种模式。
ALPHA_8就是Alpha由8位组成
ARGB_4444就是由4个4位组成即16位,
ARGB_8888就是由4个8位组成即32位,
RGB_565就是R为5位,G为6位,B为5位共16位。
不要问我ARGB-8888为什么是三十二位,因为四八三十二。
众所周知一个字节的存储单位能存储8位,所以以最占内存的ARGB-8888为
例这种模式下一个像素点会占用4个字节。也就是说,总占用内存数量为
800*480*4=1536000字节=1536kb=1.536mb。将ARGB-8888转换为RGB-565,
就可以降低一半的内存消耗,但是会损失透明度,在你不需要透明度的情
况下,就可以这样处理。这样不会损失清晰度。这就是第一种压缩方法。
第二种压缩方法也是比较常见的,bitmap的自适应压缩。也就是说,如果图片是8000*4000,而手机屏幕控件需要的只有800*400,那么我就需要将图片的长和宽压缩到原来的1/10,这样内存占用减少到原来的1/100,具体方法就是bitmap工厂创建bitmap对象的时候加上一个自己设置的options,并且options通过这个方法,
public static int calculateInSampleSize(BitmapFactory.Options
options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width /
(float) reqWidth);
inSampleSize = heightRatio < widthRatio ?
heightRatio : widthRatio;
}
return inSampleSize;
}
去动态计算需要压缩的倍数,这样就可以在视野范围内对图片进行无损压缩,但是如果你要放大,就不行了。
第三种方法,这里放上一个链接,https://github.com/Curzibn/Luban
这是Curzibn大神写的一个,仿照微信的一个压缩图片的方法,实测可以将10m左右的图片压缩到1m以下,不放很大看看不出损失清晰度的,具体就是写了一个算法吧,大神的代码我就不多解释评价了。
第四种,也是我之前找到的一个专门用来压缩图片的框架,叫NativeImgCompress的一个强大的压缩图片框架,github上能下载,地址是https://github.com/lichao3140/NativeImgCompress1
打开jar包里面是ndk写的 jni方法调用C语言算法的东西,总之非常强大。
最近想给我和我老婆写一个结婚照的app记录一下我们的一生,就用的这个压缩方法压缩的图片,很强大,用法核心代码就这一行
NativeUtil.compressBitmap(File1, File2, 50);就可以把原路径的图片转存到新路径,你的10m图片就变成几百k了,当然50是可以调整的。
推荐采用第三种第四种,因为不仅可以减少内存的占用,也可以减少apk安装包的大小,瘦身还是开发者都需要的。
另外推荐一下一个原创帖子,apk瘦身图片资源优化处理
http://blog.csdn.net/chzphoenix/article/details/75227590
写了这么多希望对每个需要图片处理的童鞋有所帮助,收藏一波走起吧!