概要
大多数下载流量由图像组成。因此,您可以制作可下载图片的尺寸越小,您的应用可以为用户提供的网络体验就越好。本页面提供了有关如何缩小图像文件并使网络更友好的指导。
关于图像格式
Android应用程序通常使用以下一种或多种文件格式的图像:PNG,JPG和WebP。对于这些格式中的每一种,都可以采取一些步骤来减小图像大小。
PNG
缩小PNG文件的一个关键是减少构成图像的每行像素中使用的唯一颜色的数量。通过使用较少的颜色,可以提高管道所有其他阶段的压缩潜力。
减少独特颜色的数量会产生显着差异,因为PNG压缩效果部分是水平相邻像素颜色变化程度的函数。因此,减少每行PNG图像中唯一颜色的数量可以帮助减少文件大小。
在决定是否采取这种策略时,应该记住,减少唯一颜色的数量有效地等同于对图像应用有损编码阶段。然而,编码工具可能并不能很好地判断一个看起来很小的错误对人眼的坏处。因此,您应该手动执行此项工作,以帮助确保高效压缩和可接受的图像质量之间的正确平衡。
您可以采用两种特别有用的方法:争取索引格式,并应用矢量量化。
争取索引格式
任何尝试减少颜色的尝试应该先尝试优化颜色,以便在将图像作为PNG导出时使用INDEXED格式。INDEXED颜色模式的工作原理是选择最佳的256色使用,并将所有像素值与索引替换为该调色板。其结果是从1600万(潜在)颜色减少到256色:从每像素3(无透明度)或4(有透明度)字节到每像素1字节。这一改变是文件大小缩减的重要步骤。
显示了图中图像的调色板:
将图像表示为调色板图像大大改善了文件大小,因此值得研究是否可以转换大部分图像。
当然,并不是每个图像都能用256种颜色精确表示。例如,某些图像可能需要257,310,512或912种颜色才能看起来正确。在这种情况下,矢量量化也是有帮助的。
矢量量化
创建索引图像的过程可以更好地描述为矢量量化(VQ)。VQ是多维数字的舍入过程。在这个过程中,图像中的所有颜色将根据其相似性进行分组。对于给定的组,该组中的所有颜色都被单个中心点值替换,从而最大限度地减少该单元格中颜色的误差(如果使用Voronoi术语,则为“站点”)。在图3中,绿点代表输入颜色,红点代表输入颜色的中心点。每个单元格都以蓝线为界。
将VQ应用于图像的结果减少了独特颜色的数量,用视觉质量“非常接近”的单一颜色替换每组颜色
该技术还允许您定义图像中唯一颜色的最大数量。例如,图4显示了一个1670万色(每像素24位,或bpp)的鹦鹉头,以及仅允许使用16(3 bpp)唯一颜色的版本。
马上,你可以看到质量下降; 大部分渐变颜色已被替换,赋予图像带状效果。该图像需要超过16种独特的颜色。
在流水线中设置VQ步骤可帮助您更好地了解图像使用的独特颜色的真实数量,并可帮助您显着减少这些颜色。有许多现成的工具可用于帮助您实施此技术。
JPG
如果您使用的是JPG图片,则可以进行一些小的更改,从而可能节省大量文件。这些包括:
- 通过不同的编码方法生成较小的文件大小(不影响质量)。
- 稍微调整质量以获得更好的压缩效果。
追求这些策略通常可以使您将文件大小减少至25%。
在选择工具时,请记住照片导出工具可以将不必要的元数据(如GPS信息)插入到图像中。至少,尝试利用现有工具来帮助从文件中去除这些信息。
WebP
WebP是Android 4.2.1(API级别17)支持的更新图像格式。这种格式为网络上的图像提供了卓越的无损和有损压缩。使用WebP,开发人员可以创建更小,更丰富的图像。WebP无损图像文件平均 比PNG 小26%。这些图像文件还支持透明度(也称为Alpha通道),代价仅为 22%的字节数。
在相同的SSIM 质量指标下, WebP有损图像 比可比较的JPG图像 小25-34%。对于有损RGB压缩可接受的情况,有损WebP也支持透明度,通常会产生比PNG小3倍的文件大小。
有关WebP的更多信息,请访问 WebP网站。
您可以使用Android Studio将现有的BMP,JPG,PNG或静态GIF图像转换为WebP格式。有关更多信息,请参阅使用Android Studio创建WebP图像。
选择一种格式
不同的图像格式适用于不同类型的图像。JPG和PNG具有非常不同的压缩过程,并且它们产生完全不同的结果。
PNG和JPG之间的决定往往归结为图像本身的复杂性。图5显示了两个图像,根据开发人员应用哪种压缩方案,出现了很大不同。左侧的图像具有许多小细节,因此可以更高效地使用JPG进行压缩。右边的图像以相同的颜色运行,使用PNG更有效地压缩。
WebP作为一种格式可以同时支持有损和无损模式,使其成为PNG和JPG的理想替代品。唯一要记住的是,它仅在运行Android 4.2.1(API级别17)及更高版本的设备上具有本机支持。幸运的是, 大多数设备都满足这一要求。
图提供了一个简单的可视化来帮助您决定使用哪种压缩方案。
确定最佳质量值
有几种技术可以用来实现压缩和图像质量之间的正确平衡。一种技术使用标量值,因此仅适用于JPG和WebP。另一种技术利用Butteraugli库,可用于所有图像格式。
标量值(仅适用于JPG和WebP)
JPG和WebP的强大之处在于您可以使用标量值来平衡质量和文件大小。诀窍是找出图像的正确质量值。质量水平太低会以图像质量为代价生成一个小文件。过高的质量水平会增加文件大小,而不会为用户带来明显的好处。
最直接的解决方案是选择一些非最大值,并使用该值。但是,请注意质量值会以不同方式影响每个图像。例如,75%的质量在大多数图像上可能看起来不错,但可能有些情况并不如此。您应该确保根据具有代表性的图像样本测试您选择的最大值。此外,请确保对原始图像执行所有测试,而不是压缩版本。
对于每天上传并重新发送数百万JPG文件的大型媒体应用程序而言,针对每项资产进行手动优化是不切实际的。根据图像类别,您可以通过指定几个不同的质量级别来应对这一挑战。例如,您可以将35%设置为缩略图的质量设置,因为较小的图像会隐藏更多的压缩工件。
Butteraugli
Butteraugli项目是一个图像库,用于测试图像的视觉误差阈值:观察者开始注意到图像质量下降的点。换句话说,这个项目试图量化压缩图像的扭曲程度。
Butteraugli允许您为视觉质量定义目标,然后运行PNG,JPG,WebP有损和WebP无损压缩。然后,您可以选择文件大小和Butteraugli级别最佳平衡的图像。图7显示了Butteraugli如何在视觉失真高到足以让用户察觉到问题之前找到最低JPG质量等级的例子; 结果是文件大小减少了大约65%。
Butteraugli允许您根据输出或输入进行操作。也就是说,您可以在用户感知最终图像中明显的失真之前查找最低质量设置,或者可以迭代设置图像失真水平以了解其关联质量水平。
供应尺寸
在服务器上保留图像的单个分辨率是很诱人的。当设备访问图像时,服务器以该分辨率提供服务,并将缩小比例放到设备上。
这种解决方案对于开发者来说很方便,但对用户来说可能会很痛苦,因为解决方案会迫使用户下载比他们需要的更多的数据。您应该存储多种尺寸的图像,并提供最适合特定用例的尺寸。例如,对于缩略图,服务实际的缩略图图像而不是服务和缩小全尺寸版本会消耗更少的网络带宽
这种方法对下载速度有好处,对于可能使用有限或计量数据计划的用户来说成本较低。像这样继续进行也会导致图像在设备和主内存上占用更少的空间。在大图像(例如4K图像)的情况下,此方法还可以避免设备在加载之前调整图像大小。
实施这种方法需要您有一个后端映像服务,以提供具有适当缓存的各种分辨率的图像。现有的服务可以为这项任务提供帮助。例如, App Engine随附已安装的图像大小调整功能。
联系我
QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ
公众号推荐:
转载于:https://blog.51cto.com/4789781/2120427