图片格式
准备知识
- 压缩方法:有损vs无损
- 索引色vs直接色
- 索引色是存储一个索引,然后点阵用索引来表示。
- 直接色。用数字来表示颜色,例如 RGBA
- 点阵图vs矢量图
格式 | 特点 | 简评 |
---|---|---|
BMP(BitMap) | 无损,支持索引色和直接色,点阵图 | 古老格式。无压缩,通常很大 |
GIF(Graphics Interchange Format) | 无损、索引色、点阵图 | 用 LZW 压缩算法。仅支持8bit的索引色,也就是说整个图片只能有 256 种颜色。适用于对色彩要求不高同时需要文件体积较小的场景,比如企业Logo、线框类的图等。还支持动图。 |
JPEG | 有损、直接色、点阵图 | 设计目标是在不影响人类可分辨的图片质量的前提下,尽可能的压缩文件大小。用直接色所以色彩丰富,适合存储照片。与GIF相比,不适合用来存储企业Logo、线框类的图。因为有损压缩会导致图片模糊,而直接色又会导致图片文件较GIF更大。 |
PNG-8(Portable Network Graphics) | 无损、索引色、点阵图 | 最多 256 种颜色,尽可能使用PNG-8而不是GIF,它体积更小,还支持透明度的调节。PNG 都使用了 DEFLATE 压缩算法 |
PNG-24 | 无损,直接色,点阵图 | 是PNG的直接色版本。RGB 的 3 通道各用8bit来存储 |
PNG-32 | 无损、直接色、点阵图 | RGBA 的 4 通道各用8bit来存储 |
SVG(Scalable Vector Graphics) | 无损、矢量图 | 使用XML来描述图片 |
WebP | 支持有损和无损压缩的、直接色、点阵图 | 谷歌开发,目标是相同精度下尽量降低体积 |
tiff | 一般用于印刷图片,平面设计可以保存格式并发送给制作部门制作实物,图片也一般较大 | |
RAW | 存储相机传感器捕获的未经处理的数据,体积很大。可以无限次调整曝光、色温、白平衡而不降低图像质量。无需担心像 JPEG 那样每次编辑都降低质量 |
视频格式
格式 | 特点 | 其它 |
---|---|---|
.avi |
图像质量好,体积庞大 | 微软开发。压缩标准不统一,时常会出现由于视频编码问题 |
MPEG(.MPG .MPEG .MPE .DAT .VOB .ASF .3GP .MP4 |
使用最少的数据获得最佳的图像质量 | 英文全称为Moving Picture Experts Group |
Real Video .RM .RMVB |
400-500kbps码率下还有很不错的清晰度 | |
flv | 比RMVB更优秀 | |
.MOV |
美国Apple公司开发的一种视频格式,默认的播放器是苹果的QuickTime | QuickTime File Format |
WMV .WMV .ASF |
本地或网络回放,丰富的流间关系以及扩展性等。需要在网站上播放,需要安装Windows Media Player,很不方便,现在已经几乎没有网站采用了。 | 微软,Windows Media Video |
Matroska .MKV |
是一种新的多媒体封装格式,这个封装格式可把多种不同编码的视频及16条或以上不同格式的音频和语言不同的字幕封装到一个Matroska Media档内。它也是其中一种开放源代码的多媒体封装格式。Matroska同时还可以提供非常好的交互功能,而且比MPEG的方便、强大。 |
总结:
- MKV是比较先进的。
- H.264.现在常用。H.265 压缩率更好
指标
- 码率(Mbps)*时间(秒)/8=文件大小(MB)
- 1080p的:视频码率过一万,分辨率1920x1080,文件大小10g+
- 720的:视频码率大概是3000~4000,分率1280x720,文件大小5g左右 在线点播网站顶多只能算伪高清,只有分辨率达到标准,码率只有2000左右。对高清发烧友而言,这是无法忍受的。
JPEG 压缩算法
有这几个步骤:
- 颜色空间转换。RGB 转 YCbCr
- Y分量表示亮度(明亮程度),而Cb和Cr分量则表示色度(颜色信息)。
- 原理:人眼对亮度变化更敏感,因此可以对亮度和颜色做不同程度的压缩。
- 下采样(Subsampling)
- 最常见的4:2:0,在每个 2x2 区域上,保留 4 个 Y 值,1 个平均后的 Cb 值,1 个平均后的 Cr 值
- 4:2:2,水平的 2x1 区域上,保留 2 个 Y 值,1 个平均后的 Cb 值,1 个平均后的 Cr 值
- 4:4:4,不做下采样,所有值都保留
- 分块。将图像划分为 8×8 的像素块。
- 离散余弦变换(DCT):对每个 8x8 块进行DCT变换。
- 原理:人眼对高频信息敏感度小于低频信息
- DCT将空间域(像素值)转换为频率域,大多数高频信息会被压缩,而低频信息则会被重点保留。
- 8x8 的区域 DCT 后,生成一个 8x8 的实数矩阵
- 量化(Quantization)
- 关键的有损步骤,极大提高压缩程度。
- 使用量化表对 DCT 系数进行量化。量化表是一个预先定义的矩阵,其中每个元素对应于 DCT 系数的一个缩放因子。
- 将 DCT 系数除以量化表中的相应元素,然后四舍五入为整数,减少系数的精度,从而实现压缩。量化表的设计通常根据人类视觉系统的特性进行,对低频系数采用较小的量化步长,对高频系数采用较大的量化步长。
- 合理选择量化表,可以在压缩比和图像质量之间进行平衡。
- 看起来量化过程把一个 8x8 矩阵映射到另一个 8x8 矩阵,那么这过程中如何压缩数据的?
- 高频区域对应的系数更可能压缩到接近0,从而变成 0,这样系数矩阵变得更加稀疏,在下一步能很好的压缩;而其它区域产生的结果,也是几十以内的整数,可以用较少的位表示;
- 熵编码(Entropy Coding):对量化后的DCT系数进行熵编码,通常使用哈夫曼编码来进一步压缩数据。熵编码可以根据符号出现的频率对数据进行编码,从而实现有效压缩。
- 图像较大时,确定 Huffman 树消耗计算资源较多,因此往往预先规定一个 Huffman 编码表
- 生成JPEG文件:上述处理后的数据,添加元信息、压缩信息,输出为图片文件
而解压过程则是以上步骤倒过来
名词解释
- 高频区域:细节、噪声
- 低频区域:图像的大面积的均匀区域、缓慢变化的色调以及物体的大致轮廓等。例如:一幅蓝天白云的照片中,广阔的蓝天部分颜色变化相对缓慢,这就是低频信息的体现。天空的整体色调较为一致,没有剧烈的色彩或亮度变化。一个人物肖像照片中,人物的脸部大面积的肤色区域通常也属于低频信息,因为肤色在局部范围内的变化相对较小。
其他压缩理论
考虑使用 720✖️480✖️24 比特像素阵列描绘 1小时的电影,其大小是:(30帧/秒)✖️(720✖️480 像素/帧)✖️(3字节/像素)✖️(3600秒/小时)✖️(2小时)≈200GB
这肯定是不能接受的。
对冗余做分类
- 编码冗余。例如,颜色出现的次数不一样,但都用8位bit
- 解决方案:变长编码(一个例子是 Huffman 编码)
- 空间和时间冗余。例如,灰度图很多像素和相邻像素是一样的,因此没必要重复。视频里相邻帧的像素也很可能是一样的。
- 不相关信息。例如,包含一些人类视觉系统无法感知的,或者用途无关的信息。
一些常用方法
- Huffman 编码
- Golomb 编码。用于对非负整数的编码。如果被表示的整数服从集合分布,压缩效果最好。
- LZW 编码
- 利用了空间结构,因此往往比 Huffman 压缩率更高。
- LZW 编码先生成一个字典,然后把某些连续的像素映射到字典上。
- 例如,采用9比特字典(也就是字典容量512个),然后把“连续两个白色像素”映射到某个表示(例如256)。如果图像中有很多“连续两个白色像素”,那么就达到了很好的压缩效果。
- 另外,0~255这256个,仍然分配给原本的0~255灰度级。
行程编码。编码模式中,用两个字节 RLE 表示,
- 第一个字节表示连续像素的数目。0表示一行的末尾或整个图像的末尾。
- 第二个字节表示颜色索引。如果是8比特,表示256色。
行程编码绝对值模式
- 第一个字节是0
- 第二个字节通知4种可能的条件
- 第二个字节是0,表示一行的末尾
- 第二个字节是1,表示一幅图的末尾
- 第二个字节是2,则下两个字节是水平偏移和垂直偏移
- 第二个字节是3~255之间,指定非压缩像素的数量