首页/文章/javascript

图片性能优化:了解JPEG、GIF、PNG、WebP、Base64的优缺点

2024-08-31
443815 分钟
...

网站作为一种信息传递的媒介,且如今各类Web项目中,图像资源的使用占比也越来越大,更应当注重图像资源的使用方式。

本文将研究:图像文件都有哪些格式?不同的业务场景应该选择怎样的图片格式?

图像资源优化的核心,可以总结为两个字: 压缩。无论是选取何种图像的文件格式,还是针对同一种格式压缩到更小的尺寸,本质都是用更小的资源开销来完成图像的传输和展示。

在深入探讨之前,我们先思考一下预期的信息传递效果,我们是否真的需要图像?这不仅是因为图像资源与网页上的其他资源(HTML/CSS/JavaScript)等,有更大的开销,其次也要珍惜用户的注意力,如果一个页面打开后有很多图像,那么用户其实很难快速梳理出很多有效信息,即使获取到了也会让用户觉得很累。

所以,在使用图像作为信息传递的载体之前,先去思考这种选择是否必需。

1.矢量图

矢量图中的图形元素用一个对象来表示,包括颜色、大小、形状及屏幕位置等属性。适合用在文本、品牌logo、控件图标及二维码等构图形状比较简单的几何图形。

SVG是一种基于XML格式的图像格式,其全称是Scalable Vector Graphics(可缩放的矢量图形),目前几乎所有的浏览器都支持SVG。

矢量图的优点

能够在任何缩放比例下呈现出细节同样清晰的展示效果。

矢量图的缺点

对细节的展示效果不够丰富,对足够复杂的图像来说,比如要达到照片的效果,若通过SVG进行矢量图绘制,则所得的文件会打的离谱(不要再问为何细节丰富的图像不用svg格式了,不合适!),但是即使入也很难达到照片的真实效果。

阿里巴巴的图标库中截取一部分矢量图,一般是这种风格的内容

SVG文件的内容如下图

SVG标签所包含的部分就是该矢量图的全部内容,除了必要的绘制信息,可能还包括了一些元数据,比XML命名空间、图层及注释信息。但这些信息对浏览器绘制一个SVG来说并不是必要的,所以在使用前可以通过工具去除这些元数据来达到压缩的目的

2.位图

位图是通过对一个矩阵中的栅格进行编码来表示图像的,每个栅格只能编码表示一个特定的颜色,如果组成图像的栅格像素点越多且每个像素点所能表示的颜色范围越广,则位图图像整体的显示效果就会越逼真。

虽然位图没有像矢量图那种不受分辨率影响的优秀特性,但对于复杂的图片却能提供较为真实的细节体验,如下面这张图的细节表现,如果用矢量图来事项是不可想象的。

当把图像不断放大后,就会看到许多的栅格像素色块。每个像素存储的是图像局部的RGBA信息,即红绿蓝三色通道及透明度。通常浏览器会为每个颜色通道分配一个字节的存储空间,28=2562^8 = 256个色阶值。

一个像素点4个通道就是4个字节,一张图像整体的大小与其包含的像素数成正比,图像包含的像素越多,所能展示的细节就越丰富,同时图像就越大。

图像尺寸像素数量文件大小
100 * 10010,00039kb
200 * 20040,000156kb
500 * 500250,000977kb
800 * 80064,00002.5MB

对于图像文件而言,由于人眼对不同颜色的敏感度存在差异,所以便可通过减少都对某种颜色的编码位数来减少文件大小,甚至可以损失部分源文件信息,以达到近似的效果,使得压缩后的文件尺寸更小。

图像压缩的有损和无损

对于图像压缩,应该采用有损压缩还是无损压缩?如果都采用又该如何搭配设置呢?关于压缩的技术选型可以简单分成两步进行。

1.确认业务所要求的图像质量

如果业务所要求的图像质量较高,直接跳过有损压缩,进入无损压缩,否则进行有损压缩。是否进行有损压缩,是在了解了业务需求后的一个可选选项,而非必要的。

2.设计自动化执行

当确定了展示的图像质量后,便可利用无损压缩技术来尽可能降低图像大小。无损压缩是应当完成的工作环节。那最好能通过一套完善的工程方案,自动化执行来避免繁琐的人工重复工作。

实际上,不同的图像文件格式之间的区别,在于他们进行有损压缩和无损压缩过程中采用了不同的算法组合。

1.JPEG

JPEG是一种有损压缩算法,它通过去除相关冗余图像和色彩数据等方式来获得较高的压缩率,同时还能展现出相当丰富的图像内容。

JPEG在网站开发中经常被用作背景图、轮次图等,以呈现色彩丰富的内容。但由于是有损压缩,当处理Logo或者图标时,需要较强线条感和强烈颜色对比,JPEG图像可能会出现一些边界模糊的不佳体验,另外JPEG图像并不支持透明度

JPEG包含了多种压缩模式,其中常见的有基于基线的、渐进式的。

基线式的压缩模式

基线式的JPEG加载顺序是自上而下的,当网络连接缓慢或不稳定时,其是从上往下逐渐加载完成的。

渐进式的压缩模式

渐进式模式是将图像文件分为多次扫描,首先展示一个低质量模糊的图像,随着扫描到的图像信息不断增多,每次扫描过后所展示的图像清晰度也会不断提升。

渐进式JPEG的优点是显而易见的,在网络连接缓慢的情况下,首先能快速加载出一个图像质量比较模糊的预览版本,这样用户便可据此了解图像的大致内容。

渐进式JPEG的解码速度会比基线的要慢一些,因为它增加了重复的检索开销。

如果所得到的图像不是渐进式JPEG,那么我们可以通过许多第三方工具来进行处理,例如imagemin、libjpeg、imageMagick等。值得注意的是,这个步骤应当尽量交给构建工具来自动化完成。

2.GIF

GIF是Graphics Interchange Format的缩写,也是一种比较早的图像文件格式。由于对支持颜色数量的限制,256色远小于展示照片所需颜色的数量级,所以GIF并不适合用来呈现照片,可能用来呈现图标或Logo会更适合一些,但后来推出的PNG格式对于图形的展示效果更佳,所以当下只有在需要使用到动画时才会使用GIF

GIF展示的动画没有声音,最高支持256色的图像质量,如果动画长度较长,即便压缩过后文件也会较大。综合考虑,建议将内容较长的GIF动画转换为视频,成熟的视频编码格式可以让传输的动画内容节省网络带宽开销。

相比视频文件,GIF在解码阶段也是十分耗时的,所以出于对性能的考虑,在使用GIF前应尽量谨慎选择。 不同格式文件,在解码阶段的CPU占用时如下表所示

文件格式CPU耗时(ms)
GIF2,668
WPEG-41,995
WebM2,395

3.PNG

PNG是一种无损压缩的高保真图片格式,它的出现弥补了GIF图像格式的一些缺点,同时规避了当时GIF还处在专利保护期的压缩算法。

相比于JPEG,PNG支持透明度,对线条的处理更细腻,并增强了色彩的表现力,不过唯一不足是文件体积过大。通常在使用中会碰到PNG的几种子类型,有PNG-8、PNG-24、PNG-32等。

其中PNG-8也称为调色板PNG,除了不支持动画,其他所有GIF拥有的功能它都拥有,同时还支持完全的alpha通道透明。只要不是颜色数特别少的图像,PNG-8的压缩比表现都会更高一筹。在使用单帧图形图像时,应当尽量用PNG-8格式来替换GIF格式。

当所处理图像中的颜色超过256种时,就需要用到JPEG或者真彩PNG,真彩PNG包括PNG-24和PNG-32,二者的区别是真彩PNG-24不包括alpha透明通道,而加上8位的alpha透明通道就是真彩PNG-32。

PNG图像格式还有一个优点,就是便于扩展,它将图像的信息保存在“块”中,开发者变可以通过添加一些自动以的“块”来实现额外的功能,但所添加的自定义功能并非所有软件都能读取识别,大部分可能是只是特定的作图软件在读取时使用而已。

4.Webp

前面介绍的三种图像文件格式,在呈现位图方面各有优劣势:GIF虽然包含的颜色阶数少,但能呈现动画;JPEG虽然不支持透明度,但图像文件的压缩比高;PNG虽然文件尺寸较大,但支持透明且色彩表现力强。

开发者在使用位图时对于这样的现状就需要先考虑选型。假如有一个统一的图像文件格式,具有之前格式的所有优点,WebP就在这样的期待中诞生了。

WebP是Google在2010年推出的一种图像文件格式,它的目标是以较高的视觉体验为前提的,尽可能地降低有损压缩和无损压缩后的文件尺寸,同时还要支持透明度与动画。

根据WebP官方给出的实现数据,当使用WebP有损文件时,文件尺寸会比JPEG小25~34%,而使用WebP无损文件时,文件尺寸会比PNG小26%。

根据CanIuse.com于2024年8月的数据统计情况,WebP的兼容性如下

可以看到,除了IE,基本上主流浏览器都已经支持webP。 在工程项目中可以使用webp-loader将如此转换成webP。

5.SVG

不同于前面的格式是位图,SVG呈现的是矢量图,SVG对图像的处理不是基于像素栅格的,而是通过图像的形状轮廓、屏幕位置等信息进行描述的。

SVG这种基于XML语法描述图像形状的文件格式,可以无限放大并且不会失真,表示Logo等图标图像,无论分辨率多高的屏幕,一个文件就可以统一适配。作为文本文件,除了可以将SVG标签像写代码一样写在HTML中,还可以把对图标图像的描述信息写在以.svg为后缀的文件中进行存储和引用。

由于文本文件的高压缩比,最后得到的图像文件体积也会更小。要说缺点与不足,除了仅能表示矢量图,还有就是使用的学习成本和渲染成本比较高。

在工程中可以利用svgo-loader做一些压缩和优化工作。

6.Base64

准确地说,Base64并不是一种图像文件格式,而是一种用于传输8位字节码的编码方式,它通过将代表图像的编码直接写入HTML或CSS中来实现图像的展示,所以用他来存放图像信息就不需要发起网络请求。但是,一般经过Base64编码后端的图像大小,会膨胀四分之三,所以,只有对于小图(公司规范要求不超过8KB)而言,Base64才能体现出真正的性能优势。

汇总对比表格

格式压缩算法优点缺点
JPEG有损压缩能够呈现丰富的图像内容可能出现边界模糊的情况
GIF可以用来展示动画不适合用来呈现图片,解码的耗时比视频格式差
PNG无损压缩PNG支持透明度,对线条的处理更细腻,并增强了色彩的表现力增加支持了透明度,图片信息更多故而相比其他,文件体积大
WebP支持有损和无损具有之前格式的所有优点浏览器兼容性 (目前除了IE都支持)
Base64无须等待网络请求文件体积会膨胀四分之三

文件使用策略

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
javascript2026-02-24
navigator.sendBeacon全指南
在前端开发中,埋点系统是必不可少的一环。我们经常需要在用户 关闭页面 、 刷新 或 跳转路由 时,向服务器发送最后一条统计数据(比如用户停留时长、页面跳出率)。 但这看似简单的需求,在实现时却危机四伏:请求发不出去?页面跳转卡顿?今天我们就来聊聊这个问题的终极解决方案 —— 。 一、 痛点与传统方案的挣扎 场景还原 当用户点击关闭按钮时,浏览器会触发生命周期事件( 或 )。如果我们直接使用普通的异步 AJAX ( 或 ) 发送请求,浏览...
学习
javascript2025-11-02
理解浏览器事件系统,从用户点击到事件对象的完整旅程
深入理解浏览器事件系统:从用户点击到事件对象的完整旅程 “当我点击页面按钮时,背后发生了什么?为什么回调函数能收到一个包含丰富信息的event对象?今天,让我们一起揭开浏览器事件系统的神秘面纱。” 一个令人困惑的现象 作为前端开发者,我们每天都在写这样的代码: 这段代码如此熟悉,以至于我们很少停下来思考:​ ​这个 对象到底从哪里来?它为什么能知道点击的精确坐标?为什么能识别是哪个元素被点击了?​ ​ 更神奇的是,当我们手动创建事件时:...
学习
javascript2025-10-01
实现大文件上传全流程详解
在日常开发中,大文件上传是个绕不开的坎——动辄几百 MB 甚至 GB 级的文件,直接上传不仅容易超时,还会让用户体验大打折扣。最近我用 Vue+Express 实现了一套完整的大文件上传方案,支持分片上传、断点续传、秒传和手动中。 一、先看效果:我们要实现什么? 先上核心功能清单,确保大家明确目标,知道我们要解决哪些实际问题: 大文件分片上传 :将文件切成固定大小的小片段分批上传,避免单次请求超时 秒传 :服务器已存在完整文件时,直接返...
学习
javascript2025-09-18
JavaScript 的多线程能力:Worker
如果你写过一些计算量稍大的 JavaScript 代码,比如图像处理、大量数据排序或者复杂的算法,你几乎肯定遇到过浏览器“卡死”的现象。点击页面没反应,动画也停了,就像整个世界都静止了。 这就是主线程被阻塞的典型后果。因为主线程既要负责执行 JavaScript,又要负责渲染页面、响应用户操作,一旦它被繁重的计算任务占满,就无暇顾及其他,用户体验便直线下降。 这个问题的根源,正是“主线程是单线程的”。那么,如何解决呢? 答案很简单:把这...
学习面试
javascript2025-09-15
一张 8K 海报差点把首屏拖垮
你给后台管理系统加了一个「企业风采」模块,运营同学一口气上传了 200 张 8K 宣传海报。首屏直接飙到 8.3 s,LCP 红得发紫。 老板一句「能不能像朋友圈那样滑到哪看到哪?」——于是你把懒加载重新翻出来折腾了一轮。 解决方案:三条技术路线,你全踩了一遍 1\. 最偷懒:原生 一行代码就能跑,浏览器帮你搞定。 🔍 关键决策点 2020 年后现代浏览器全覆盖,IE 全军覆没。 必须写死 ,否则 CLS 会抖成 PPT。 适用场景...
学习
javascript2025-09-10
🚀 Web Worker让你的应用丝滑
🌟 引言 在日常的前端开发中,你是否遇到过这样的困扰: 大数据处理时页面卡死 :处理几万条数据时,页面直接卡成PPT,用户点击毫无反应 复杂计算阻塞UI :图片处理、数据分析等计算密集型任务让整个应用假死 文件上传/下载卡顿 :大文件操作时,其他功能完全无法使用 实时数据处理性能差 :WebSocket接收大量数据时,页面渲染严重滞后 今天分享6个Web Worker的核心技巧,让你的应用告别卡顿,用户体验丝滑如德芙! 💡 核心技巧...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录