1)一张图片如何显示到屏幕上
- 一个电脑显示器, 上面的像素点就是内存/显存
- 一张图片表达的颜色信息赋值到那块内存就是图片显示
2)图片文件的格式
图片文件的格式,无论是哪一种,最终都要包含原始颜色数据
原始颜色数据
- 一个像素用rgba 表示,4bytes
- 比如 1000x1000,存32位色,原始大小4M
3)图片无损压缩原理
Sliding Window Algorithms
基于滑动窗口缓存的技术,该缓存用于保存最近刚刚处理的文本
例子:lzss
Dictionary Algorithms
通过建立字典,实现字符重用与编码,适用源码中重复率高的文本压缩。
例子:lzw
4)图片有损压缩原理
把图片当做信号,将时域转频域,丢弃高频数据;
信号、时域、频域
- 一个信号, 原始的波形图称为时域图
- 比如常见的方波,模拟现实生活中的数字信号(01)
- 一个信号(时域)可以用多个正弦波叠加而成
- 傅里叶变换: 把信号分解成正弦波的叠加
?
图片的时域转频域
- 把图片当做是信号
- x轴(时间)表示像素点的坐标;
- y轴(值域)表示颜色的值;
- 应用傅里叶变换, 把信号(时域), 转成频域
- 频域图表达的是N个正弦波的叠加
- 所以图片需要存储的数据量: 正弦波参数的表达(比如4bytes,一个波4个参数) * N
图片当做信号
对于YUV格式的图片可以当作: 3条信号
对于RGBA格式的图片可以当作: 4条信号
为什么选择快速傅里叶变换
傅里叶变换复杂,电脑算很久
计算机的世界都是模拟的,不需要100%的精度, 快速傅里叶变换的运算精度是能够接受的
高频与低频
波有频率, 表示波的周期
周期长的波是低频率的波; 周期长的波勾勒信号的大致形状;
周期短的波是高频率的波; 是一些细节, 丢弃细节相当于降低图片质量;
所以对于一个频域, 丢掉高频的波, 可以进一步压缩数据;
jpg的压缩算法
jpg采用DCT(离散余弦变换), 来实现把时域转成频域。
jpg采用 (RLE 和 哈夫曼编码)来进一步压缩, 无损压缩。
5)图片压缩的流程
- 原始大小:1000x1000 RGBA -> 4M
- rgba 转 Y_UV -> 2M
- 有损压缩
- 转成 8*8 像素格子
- 对于每个格子,时域转频域(FFT 或 DCT)
- 丢弃高频信息
- lzw 无损压缩 -> ~200k