Android图片资源瘦身的方法是什么

78次阅读
没有评论

共计 1430 个字符,预计需要花费 4 分钟才能阅读完成。

这篇文章主要介绍“Android 图片资源瘦身的方法是什么”,在日常操作中,相信很多人在 Android 图片资源瘦身的方法是什么问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android 图片资源瘦身的方法是什么”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

一. 选择压缩工具

首先是选择压缩工具的问题, 在这之前先看下系统是如何做的。android 的 aapt 在编译阶段其实是会对 png 图片进行压缩的,用的则是 libpng 和 zlib,这个可以用 aapt 的源码佐证:

用 libpng 对图片进行预处理

用 zlib 对预处理后的图片进行压缩生成新图片

可以看到 aapt 对图片的压缩等级使用了最高等级 9,期间系统也会做颜色表转换,这样可以减少很大一部分图片的体积,但系统的压缩方案是不是完美无缺呢? 目前常用的无损压缩大概有 Pngrewrite、pngcrush、optipng、advancecom、pngout,参考了很多文章,得出的结果是 pngout 仍然是王者,毕竟是 Ken 神童(据说 Doom and Quake 的作者 John 都尊敬他,做游戏的肯定都知道 John)写的。另外由于 pngout 可以很好的支持命令行,方便放到编译脚本中自动化,所以暂时选它好了。

二. 实践案例

压缩工具选好了,第二步便是实验了。拿手 Q 为例,直接对手 Q 中的所有 png 压一遍,Pngout 的速度确实一般,对 4 千张图片全部处理一遍大概需要 13 分钟,不过这个过程只需要在本地做一遍,所以可以忍受,但处理完的结果不理想,因为没什么效果,减小量为十几 KB~~ 仔细分析得知这里面犯浑作怪的竟然是 aapt,由于先调 pngout 再调 aapt 会导致压缩效果覆盖。那么可不可以关闭 aapt 呢?查看 aapt 的参数,关于压缩相关的只有下面这两个参数:

其中 crunch 便是预处理资源了,但是没有关闭 crunch 的参数。。。。有点技穷了对不对。只能去源码中找灵感了,看 aapt 的源码:

google 把它隐藏了,没有打印出来给用户~ 打开这个参数,在手 Q 中资源打包脚本处分别加入 –no-crunch 参数,便可以把系统压缩给屏蔽掉了,样式如下:

至于为什么设置了这个参数就可以屏蔽呢,其实源码调用过程如下:

第 1 步 (Main.cpp)

第 2 步 (Command.cpp)

第 3 步 (Resource.cpp)

终结:(Resource.cpp)

可是实验还没有结束,因为这样屏蔽掉会出现奇葩的景象,得到的手 Q 画面效果如下:

为什么呢?仔细分析发现九宫格图片被压出问题了,aapt 在处理 png 图片时会判断是不是九宫格图片,如果是则做特殊预处理:

do_9patch 其实主要的是九宫格信息弄出来,写入到 info9Patch 字段,并最终写入 nptc 的 chunk 中:

到这里又回到第一步为什么我说 Ken 是神童了,因为 Pngout 可以选择 chunk 进行压缩,所以解决方案便是:对于九宫格图片,我们单独拎出来,先用 aapt 的 aapt crunch 进行预处理得到 npTc 字段,再用 pngout 在压缩时调用 knptc 参数保护一下 npTc 块,这样便得到了正确的九宫格图片,安装包的效果图也就正常了。

到此,关于“Android 图片资源瘦身的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计1430字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)