图片压缩

1)一张图片如何显示到屏幕上

  • 一个电脑显示器, 上面的像素点就是内存/显存
  • 一张图片表达的颜色信息赋值到那块内存就是图片显示

2)图片文件的格式

图片文件的格式,无论是哪一种,最终都要包含原始颜色数据

原始颜色数据

  • 一个像素用rgba 表示,4bytes
  • 比如 1000x1000,存32位色,原始大小4M

3)图片无损压缩原理

Sliding Window Algorithms
基于滑动窗口缓存的技术,该缓存用于保存最近刚刚处理的文本
例子:lzss

Dictionary Algorithms
通过建立字典,实现字符重用与编码,适用源码中重复率高的文本压缩。
例子:lzw

无损数据压缩算法的历史

4)图片有损压缩原理

把图片当做信号,将时域转频域,丢弃高频数据;

信号、时域、频域

  • 一个信号, 原始的波形图称为时域图
  • 比如常见的方波,模拟现实生活中的数字信号(01)
  • 一个信号(时域)可以用多个正弦波叠加而成
  • 傅里叶变换: 把信号分解成正弦波的叠加

图片的时域转频域

  1. 把图片当做是信号
    • x轴(时间)表示像素点的坐标;
    • y轴(值域)表示颜色的值;
  2. 应用傅里叶变换, 把信号(时域), 转成频域
  3. 频域图表达的是N个正弦波的叠加
  4. 所以图片需要存储的数据量: 正弦波参数的表达(比如4bytes,一个波4个参数) * N

图片当做信号

对于YUV格式的图片可以当作: 3条信号
对于RGBA格式的图片可以当作: 4条信号

为什么选择快速傅里叶变换

傅里叶变换复杂,电脑算很久
计算机的世界都是模拟的,不需要100%的精度, 快速傅里叶变换的运算精度是能够接受的

高频与低频

波有频率, 表示波的周期
周期长的波是低频率的波; 周期长的波勾勒信号的大致形状;
周期短的波是高频率的波; 是一些细节, 丢弃细节相当于降低图片质量;
所以对于一个频域, 丢掉高频的波, 可以进一步压缩数据;

jpg的压缩算法

jpg采用DCT(离散余弦变换), 来实现把时域转成频域。
jpg采用 (RLE 和 哈夫曼编码)来进一步压缩, 无损压缩。

5)图片压缩的流程

  1. 原始大小:1000x1000 RGBA -> 4M
  2. rgba 转 Y_UV -> 2M
  3. 有损压缩
    • 转成 8*8 像素格子
    • 对于每个格子,时域转频域(FFT 或 DCT)
    • 丢弃高频信息
  4. lzw 无损压缩 -> ~200k

例子:图片有损压缩

posted @ 2018-03-18 00:29  twlk28  阅读(356)  评论(0编辑  收藏  举报