Android性能优化-减小图片下载大小
原文链接 https://developer.android.com/topic/performance/network-xfer.html
内容概要
理解图片的格式 PNG JPG WebP
如何选择一种图片格式
确定准确质量值
服务端的尺寸大小
减小图像下载大小
大多数流量传输都包含图像。 因此,你制作的下载的图片越小,就会为用户提供更好的网络体验。 本篇文章提供了让你的图像文件更小以及更加网络友好的指导。
理解图像的格式
Android应用通常使用以下某种或多种文件格式的图片:PNG,JPG和WebP。 对于每种格式,你都可以采取措施缩小图片大小。
PNG
缩小PNG文件的关键是减少构成图像的每行像素中使用的唯一颜色数。通过使用更少的颜色,可以提高在其它管道中的压缩能力。
减少独唯一颜色的数量会取得显着效果的原因是,PNG压缩效果基于一个水平方向相邻像素颜色变化程度的函数。因此,减少PNG图像每行中唯一颜色数量可以减少文件大小。
当决定是否采用这种策略时,你应该记住,减少唯一颜色的数量实际上等于对图像应用了有损编码。然而,编码工具可能不会判断一个细小的偏差导致多糟糕的视觉效果。因此,为了保证有效压缩和可接受的图像质量的平衡,你应该手动执行此工作,
有两个特别有用的方法你可以采取:优化索引格式和应用矢量量化。
优化索引格式
任何减少颜色的尝试都应该首先尝试优化颜色,以便将图像导出为PNG时可以使用INDEXED格式。 INDEXED颜色模式会选择最佳的256色彩,并用索引将所有像素值替换到调色板中。 结果是从1600万色彩减少到仅256色彩:等同于从每像素3(没有透明度)或4(具有透明度)字节减少到每像素1字节。这种变化向减少文件迈出了重大的一步。

图片 1.一个图像在转换为INDEXED的前后对照
Figure 2 展示了图像1中的调色板

将图像表示为调色图像对于显着改善文件大小有很大帮助,因此,如果你的大多数图片都可以转换,可以好好研究一下。
当然,并不是每个图像都可以用256种色彩准确表示。 例如,某些图像可能需要257,310,512或912种颜色才能正确显示。 在这种情况下,矢量化会可能会有帮助。
矢量化
矢量化(VQ)也许是对创建索引图像的过程更好地描述。 VQ会对多维数进行舍入处理。 在此过程中,你图片中的所有颜色都将根据相似性进行分组。 对于给定的组,该组中的所有颜色都将被单个中心点值替换,这样可以最大程度地减少该单元格中的颜色错误(如果使用Voronoi术语,则为“site”)。 在图3中,绿色点表示输入颜色,而红色点是替换输入颜色的中心点。 每个单元格由蓝线界定。

图3 为图像中的颜色进行矢量化
将VQ应用于图像会减少了唯一颜色的数量,用视觉质量上“相当接近”的单一颜色替换每组颜色。
此技术也允许你为图像定义唯一颜色的最大数量。 例如,图4显示了1670万种颜色(每像素24位,或bpp)的鹦鹉头像,旁边是一个只使用16(3bpp)唯一颜色的版本。

你可以明显看到有一些质量的损失; 大多数渐变颜色已经被替换,赋予图像带状效果。 因此该图片需要超过16种唯一的色彩。
在管道中设置VQ的步骤可以帮助你对图像中使用的唯一色彩的真实数量有更好地了解,并且可以帮助你显著地减小它们。 有很多可用的工具来帮助你实现此技术。
JPG
如果你使用的是JPG图片,这里有几种只做很小的改变就可以显著节省文件大小的方法:
- 通过不同的编码方法生成较小的文件(不影响质量)。
- 稍微调整质量以得到更好的压缩。
执行这些策略通常可以将文件大小减少高达25%。
选择工具时,请记住照片导出工具会将不必要的元数据(如GPS信息)插入到图像中。为了最小化,你可以尝试利用现有工具删除这些信息。
WebP
WebP是Android 4.2.1(API 17)支持的较新的图像格式。 这种格式为网络图像提供了卓越的无损和有损压缩。 使用WebP,开发人员可以创建更小,更丰富的图像。 WebP无损图像文件平均比PNG小 26%。 这些图像文件还支持透明度(也称为alpha通道),成本只有 22% 的字节。
WebP有损图像比同等 SSIM 质量指数下的JPG图像小 25-34% 。 对于可接受有损RGB压缩的场景,有损WebP还能支持透明度,产生的文件大小通常比PNG小3倍。
有关WebP的详细信息,请访问 WebP。
选择一种格式
不同的图像格式适用于不同类型的图像。 JPG和PNG的压缩过程有很大差别,产生的效果差别也很大。
决定使用PNG还是JPG,通常归结于图像本身的复杂性。图5显示了两个图像,由于开发者应用了不同的压缩方案而导致很大的差别。左侧的图像有许多小细节,因此使用JPG压缩效率更高。右侧的图像,很多区域具有相同颜色,使用PNG压缩更有效。

图5 JPG和PNG的适用场景
WebP格式可以支持有损和无损模式,是PNG和JPG的理想替代品。唯一要记住的是,它只对运行Android 4.2.1(API 17)及更高版本的设备提供支持。不过幸运的是,大多数设备都满足这一要求。
图6提供了一个简单的图示来帮助你决定使用哪种压缩方案。

Figure 6. 如何决定一种压缩方案
确定最佳质量值
有几种技术可以用来实现压缩和图像质量之间的正确权衡。有一种技术使用标量值,因此仅适用于JPG和WebP。另一种技术利用了Butteraugli库,并可用于所有图像格式。
标量值(仅限JPG和WebP)
JPG和WebP的强大来自于你可以使用标量值来平衡质量和文件大小。诀窍是找出图像的正确的质量值。太低的质量水平虽然产生文件小,但以牺牲图像质量为代价。太高的质量水平会增加文件大小,对用户不友好。
最直接的解决方案是选择一些非最大值进行尝试。但是,请注意,质量值对每个图像的影响不同。例如,75%的质量在大多数图像上可能看起来很好,但在另一些图片上效果可能不好。你应该使用图像的代表性样本对选择的最大值进行测试。此外,要确保你是对原始图像执行所有测试,而不是压缩版本。
对于每天上传和发送数百万个JPG的大型媒体应用程序来说,手动调整每个资源是不切实际的。你可以根据图像类别指定几个不同的质量级别来解决这个问题。例如,可以将缩略图的质量设置为35%,因为较小的图像隐藏了更多的压缩伪影(伪影不是很好理解)。
Butteraugli
Butteraugli是一个库,用于测试图像的视觉误差阈值:观察者开始注意到图像质量下降的点。换句话说,这个项目试图将压缩图像的失真量化。
Butteraugli允许你定义视觉质量的目标,然后运行PNG,JPG,WebP有损和WebP无损压缩。然后,你可以选择文件大小和Butteraugli级别之间效果最佳的图像。图7示出了在视觉失真以至于用户可以感知到之前,如何使用Butteraugli来找到最低的JPG质量水平;最终文件大小减少了大约65%。

图7.应用Butteraugli技术之前和之后的图像。
Butteraugli允许你基于输出或输入进行处理。也就是说,你可以在用户感觉到图像出现明显失真之前找到最低的质量设置,或者你可以依次设置图像失真级别去观察对应的质量水平。
服务端的尺寸
在服务器上仅存有一种分辨率的图像的方式是很便利的。当设备访问映像时,服务器直接返回给设备该分辨率的图片。
虽然这个解决方案方便了开发者,但对用户来说可能很痛苦,因为这种方案迫使用户下载比实际需要更多的数据。你应该存储多个大小的图像,并根据合适的使用场景提供不同的图像。例如,对于缩略图,服务应该提供缩略图图像而不是全尺寸的版本,这样可以节省很多网络带宽。
这种方法对于下载速度是有利的,并且降低了使用有限或按数据量收费用户的成本。图像在设备和主存储器上也会占用更少的空间。在大图像(例如4K图像)的情况下,这种方式还减少了设备在加载图像之前调整大小的时间。
实现此方法需要有一个后端图像服务,以提供具有适当缓存的各种分辨率的图像。有几种现有的服务可以帮助你,例如,App Engine 自带了调整图片大小的功能。
来源:http://www.lightskystreet.com/2016/10/19/android-optimize-image-download-size/
Android性能优化-减小图片下载大小的更多相关文章
- Android 性能优化——之图片的优化
Android 性能优化——之图片的优化 在Android性能优化中,我们会发现占内存最大的和对性能影响最大的往往是图片资源,其次是控件资源.相对来说,其他的资源的影响会小一点.这里我就先对图片资源的 ...
- Android性能优化-减小APK大小
前言 用户通常会避免下载比较大的应用,特别是连接到2G和3G网络,或者按流量收费的设备.这篇文章描述了如何减小apk的大小,帮助你让更多的用户下载你的app. 一 理解APK的结构 在讨论如何减小ap ...
- Android性能优化之图片压缩优化
1 分类Android图片压缩结合多种压缩方式,常用的有尺寸压缩.质量压缩.采样率压缩以及通过JNI调用libjpeg库来进行压缩. 参考此方法:Android-BitherCompress 备注:对 ...
- Web 性能优化: 图片优化让网站大小减少 62%
摘要: 压缩各种格式的图片. 原文:Web 性能优化: 图片优化让网站大小减少 62% 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是 Web 性能优化的第二篇,上一篇在下面看点 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- android 性能优化
本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...
- Web前端性能优化之图片优化
我自己的Blog:http://blog.cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到了互联网内容总量的62%,也就是说超过 ...
- Android性能优化典范(二)
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...
- android app性能优化大汇总(google官方Android性能优化典范 - 第2季)
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...
随机推荐
- python简单笔记
Remarks:python中注意缩进(Tab键或者4个空格) print(输出) 格式:print(values) 字符串.数字.变量等都可以输出: 实例: print(1)->1 print ...
- 接口隔离原则(Interface Segregation Principle, ISP)
使用多个专门的接口,而不使用单一的总接口 接口隔离有两种定义: Clients should not be forced to depend upon interfaces that they don ...
- [转]oracle10客户端PL/SQL Developer如何连接远程服务器上的oracle数据库
时间:2013年8月21日 前提条件:假设你已经安装好了oracle和PL/SQL Developer,知道远程服务器的IP和数据库端口,知道远程服务器上的oracle数据库名和密码 如何用PL/SQ ...
- mydumper备份原理和使用方法
mydumper介绍 MySQL自身的mysqldump工具支持单线程工作,依次一个个导出多个表,没有一个并行的机,这就使得它无法迅速的备份数据. mydumper作为一个实用工具,能够良好支持多线程 ...
- asp.net core 2.0 cookie的使用
本文假设读者已经了解cookie的概念和作用,并且在传统的.net framework平台上使用过. cookie的使用方法和之前的相比也有所变化.之前是通过cookie的add.set.clear. ...
- BZOJ5071 小A的数字 BZOJ2017年10月月赛 其他
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5071 题意概括 题解 一开始蒙了. 感觉做过类似的题目. 但是找不到方法. 突然想到前缀和! 对于 ...
- zyb的面试
今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:有一个序列,是1到n的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?例如n=15,k=7, 排列顺序 ...
- Unity 之 自定义消息提示框
简单版: http://blog.csdn.net/caoshuangxiaodouya/article/details/46550655 复杂版: http://www.tuicool.com/ar ...
- AM335x启动
参考文件: 1.TI.Reference_Manual_1.pdf http://pan.baidu.com/s/1c1BJNtm 2.TI_AM335X.pdf http://pan.baidu.c ...
- python在使用MySQLdb模块时报Can't extract file(s) to egg cacheThe following error occurred while trying to extract file(s) to the Python eggcache的错误。
这个是因为python使用MySQLdb模块与mysql数据库交互时需要一个地方作为cache放置暂存的数据,但是调用python解释器的用户(常常是服务器如apache的www用户)对于cache所 ...