图像优化关键技巧6:SVG优化详解
注明:本人原创翻译,原版为Essential Image Optimization电子书,这里将其拆分为几篇文章发布。另外,文中部分链接可能会因为“网络”原因无法打开。不必着急,我会慢慢将其中一些比较好的内容翻译过来发表,都会在这个“Web图像技术深究”专题中。
目录
- 介绍
- 如何判断我的图像是否需要优化?
- 如何选择正确的图像格式?
- “素人”JPEG
-
JPEG的压缩模式
- 渐进式JPEG的优点
- 谁在生产环境中使用了渐进式JPEG?
- 渐进式JPEG的缺点
- 如何生成一个渐进式JPEG?
- 色度(或颜色)抽样
- JPEG引发的格式拓展
- 使用JPEG优化编码器
- 什么是MozJPEG?
- 什么是Guetzli?
- MozJPEG与Guetzli孰优孰劣?
- Butteraugli
-
什么是WebP?
- WebP的表现如何?
- 谁在生产环境中使用WebP?
- WebP编码如何执行?
- WebP的浏览器支持
- 如何将我的图像转换为WebP?
- 如何在我的操作系统上查看WebP图像?
- 如何提供WebP?
- SVG优化
- 避免使用有损编解码器重复压缩图像
-
减少不必要的图像解码和尺寸调整带来的损耗
- 使用srcset提供HiDPI图像
- 艺术化的响应
- 颜色管理
- 图像拼合技术
- 延迟加载非关键图像
- 避免
display: none;
的陷阱 - 图像CDN服务对你有意义吗?
- 缓存图像资源
- 预加载关键图像资源
- 图像的网络性能预算
- 最后的建议
- 附注
正文:
SVG的优化
保持SVG的优良,意味着要清除任何不必要的东西。使用编辑器创建的SVG文件通常包含大量冗余信息(元数据、注释、隐藏层等)。通常可以安全地删除此内容,或将其转换为更小的形式,而不影响当前要显示的最终SVG。
SVG优化的一些通用规则(SVGO):
- 使用Minify和gzip压缩您的SVG文件。SVG实际上只是以XML格式表示的文本资源,和CSS、HTML以及JavaScript是一样的,我们应该使用Minify和gzip压缩它以提高性能。
- 使用预定义的SVG图形如
<rect>
,<circle>
,<ellipse>
,<line>
和<polygon>
取代路径。优选预定义的形状有助于减少生成最终图像所需的标签量,也意味着较少的浏览器解析和点阵描述代码。减少SVG复杂度也意味着浏览器可以更快地显示它。 - 如果您必须使用路径(Path),请尝试减少曲线路径,尽量简化和合并它们。Illustrator的简化工具可以帮助您在复杂的艺术品中消除多余的点,同时平滑不规则的曲线。
- 避免使用组(Group)。如果不能,请尝试简化它们。
- 删除不可见的图层。
- 避免使用任何Photoshop或Illustrator效果。它们会使生成较大的位图图像。
- 仔细检查SVG中任何非友好的嵌入的位图图像。
- 使用工具优化SVG。 SVGOMG是一个Jake Archibald为SVGO编写的一个方便的Web端操作界面。如果你使用Sketch,可以在导出时使用[SVGO压缩插件](Sketch plugin for running SVGO)以减小导出文件的体积。
使用SVGO高精度模式(体积减少29%)和低精度模式(体积减少38%)处理SVG原图后的对比示例。
SVGO是一种Node.js环境下优化SVG的工具。SVGO可以通过减少你的路径(Path)中的精度点数,来减少最终文件的体积。每增加一个点位数后就会增加一个字节,这就是为什么更改精度(位数)会严重影响文件的体积。但是,改变精度需要非常小心,因为它会影响你的图形的视觉效果。
需要注意的是,虽然SVGO在前面的例子中都表现良好,并不会过分简化曲线和形状,但是有很多情况下可能不是这样。如上图,观察火箭上的线条可以看到在较低的经度下,线条是如何产生了变形。
在命令行中使用SVGO:
如果您更喜欢GUI,SVGO可以作为全局的npm CLI安装:
npm i -g svgo
然后可以对本地的SVG文件执行,如下所示:
svgo input.svg -o output.svg
它支持您可能期望的所有选项,包括调整浮点精度:
svgo input.svg --precision=1 -o output.svg
有关支持选项的完整列表,请参阅SVGO 说明文件。
不要忘了压缩SVG!
此外,不要忘记使用Gzip压缩你的SVG资源或者使用Brotli来提供服务。因为SVG是文本的,所以压缩率会非常高(可以减少50%)。
当Google发布了一个新徽标时,我们宣布其最小版本的大小只有305个字节。
有很多高级的SVG技巧可以用来将其进一步删减体积(一直到146个字节)!可以说,无论是通过工具还是手动清理,可能你都有可能将SVG的体积再刮掉一些。
SVG Sprite
SVG在制作图标时非常强大,它就像一个精灵一样,提供了一种表示可视化图形的方式,在这种方式里没有奇怪的必须使用的字体。它有着比图标字体(SVG笔触属性)更精准的CSS样式控制,更好的定位控制(不需要各种伪元素和CSS display
),并且SVG 更容易理解。
像svg-sprite和IcoMoon这样的工具,可以自动将SVG组合成sprite,并可以通过CSS Sprite,Symbol Sprite或Stacked Sprite来使用。Una Kravetz有一篇实用的文章值得看一下,其中说明了如何使用gulp-svg-sprite进行SVG Sprite工作流程。Sara Soudein也曾在她的博客中表述转变图标字体到SVG。
进一步阅读
Sara Soueidan的网页交付中的优化SVG技巧和Chris Coyier的实用SVG电子书都非常好。我还发现Andreas Larsen的优化SVG帖子很有启发(第1 部分,第2部分)。另外,在Sketch中准备和导出SVG图标也是一个很好的借鉴。
下一篇: iOS: 提升加载大图效率的策略与方法
推荐阅读
-
图像优化关键技巧6:SVG优化详解
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。