安卓关于图片压缩的那些事儿,希望给每个安卓开发人员一些帮助

540 阅读4分钟

从事安卓开发也有几年了,本人喜欢开门见山,此篇文章是处理以java语言下的安卓开发过程中图片压缩问题。

图片加载在我们的开发过程中都是一个内存大户,以至于我们加载每一个图片bitmap对象的时候都应该进行回收以减少内存的占用,而如果单张图片的大小加载在内存都会造成oom内存溢出,那么只是单纯的回收就没办法解决了。我们就会涉及到图片压缩。我总结了几种图片压缩的方式和图片占内存的形式,供大家参考。 有人说一张图片也就几mb,而手机内存有1G-8G,为什么会内存溢出呢?这就要从图片占用内存的形式说起了。

图片是由像素点组成的,我们常见的分辨率1920乘1080,960乘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

写了这么多希望对每个需要图片处理的童鞋有所帮助,收藏一波走起吧!