项目里有图片引入,不是简单的问UI要张图就结束了~
图像类型
矢量图
- 矢量图的图形元素被定义为一个对象,包括颜色、大小、形状及屏幕位置等属性
- 优点:在任何缩放比例下呈现出细节同样清晰的展示效果
- 缺点:对细节的展示效果不够丰富,对于复杂图像,用SVG绘制,文件会很大,而且很难达到照片真实效果
位图
- 通过对一个矩阵中的栅格进行编码来表示图像的,每个栅格只能编码表示一个特定的颜色
- 一个像素点4个通道是4字节,一张图像整体的大小与其包含的像素数成正比,图像包含像素越多,展示细节越丰富,图像就越大
图像格式
JPG【JPEG】(Joint Photographic Experts Group)
- 出现最早,使用范围最广的格式
- 也是一种有损压缩算法,通过去除相关冗余图像和色彩数据获得较高的压缩率,同时展现相当丰富的图像内容
- 不支持透明度
- 处理logo和图标时,会出现一些边界模糊的不佳体验
- 压缩模式
- 基线模式:加载顺序是自上而下的
- 渐进式【主流,但解码速度稍慢】:将图像文件分为多次扫描,首先展示一个低质量模糊的图片,随着扫描信息增多,图像清晰度会不断提升
- 基线模式:加载顺序是自上而下的
GIF(Graphics Interchange Format)
- 由于对支持颜色数量的限制,256色远小于展示图片需要颜色的数量级,gif不适合展示图片,后来推出的PNG对图像展示更佳,所以只有使用动画时才用gif
PNG
- 无损压缩的高保真图片格式
- 对线条处理细腻,增强了色彩的表现力,不足是文件体积太大
- 有三种子类型:PNG-8、PNG-24、PNG-32
- PNG-8称为调色板PNG,使用单帧图形图像时,尽量用PNG-8代替GIF
- 当图像颜色超过256种时,就需要用真彩PNG或JPEG。PNG-24不包括alpha透明通道,加上8位的alpha透明通道的是PNG-32
WebP
- 目标是以较高的视觉体验为前提,尽可能降低有损压缩和无损压缩后的文件尺寸,同时支持透明和动画
- WebP有损文件大小比JPEG小25%-34%
- WebP无损文件大小比PNG小26%
- 有兼容问题
SVG(Scalable Vector Graphics)
- 通过图像的形状轮廓、屏幕位置等信息描述图片
- 适合表示logo等图标图像
- 学习成本较高
- 由于显示器的本质是元素点构成位图,所以渲染矢量图时比位图多一步光栅化的过程,所以 用预定义形状
<circle>,<rect>,<line>,<polygon>,少用path甚至曲线
Base64
- 不是图像格式,是一种用于传输8位字节码的编码方式,可以将代表图像的编码写入到html中实现图像的展示
相关概念
分辨率
- 屏幕分辨率:显示器屏幕所能显示的最大像素值
- 图像分辨率:表示图像文件包含的真实像素值信息
- 一张
10*10的图像分辨率的图片可以在10*10,20*20,40*40的设备分辨率屏幕上显示,类比ratina屏幕的DPR。
压缩
- 有损压缩:对图像本身的改变,在保存图像时保留了较多的亮度信息,而将色相和色纯度的信息和周围的像素进行合并,合并的比例不同,压缩的比例也不同,由于信息量减少了,所以压缩比可以很高,图像质量也会相应的下降。
- 无损压缩:对文件本身的压缩,和其它数据文件的压缩一样,是对文件的数据存储方式进行优化,采用某种算法表示重复的数据信息,文件可以完全还原,不会影响文件内容,对于数码图像而言,也就不会使图像细节有任何损失。
图像的加载和显示
- CSS Sprite:将多张图小图拼接成一张大图,可减少HTTP请求数量,但这些小图尽量是不经常更新的静态图标,不会随用户信息变化
- 如果一张图片根据不同设备大小显隐不同图片,需将其通过css设为背景图。这样,在其父元素
display: none后,就不会加载相应不需要的资源,如果用<img />标签的话,根据HTML的解析顺序,此图片资源是会发起请求的。
格式选择建议
- 图表logo的场景用矢量图
- 相同图像质量下具有更高的压缩比且支持动画,WebP是首选
- 考虑兼容性的话,包含动画则GIF,对图像要求用高分辨率展示细节且需要透明度则PNG,追求高压缩比则JPEG
- 位图对于不同缩放比例的响应式场景,建议提供多张不同尺寸的图像
- img的srcset属性可针对不同设备,提供不同分辨率图像文件
<img src="a.jpg" srcset="a@2x.jpg 2x, a@3x.jpg 3x, a@4x.jpg 4x" />
- picture标签会在多图像文件选择时,获得更多的控制维度,如屏幕方向、设备大小、屏幕分辨率等
<picture>
<source media="(min-width: 800px)" srcset="a.jpg, a-2x.jpg 2x"/>
<source media="(min-width: 450px)" srcset="a-s.jpg, a-s-2x.jpg 2x"/>
<img src="a.jpg" />
<picture/>
总结
我们需要了解不同图片格式之间的区别,基于不同图片的优缺点及性能特征,选择最优的图片格式,给用户最佳的访问体验。目前市面上的工具,figma、zeplin等都支持直接导出不同格式的图片文件,和你的UI小伙伴商量好即可~
关注公众号:不zhi前端,一起学习,一起进步~