码迷,mamicode.com
首页 > 其他好文 > 详细

图片压缩

时间:2018-03-18 01:25:20      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:algorithm   格式   历史   body   技术分享   res   src   tree   block   

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

例子:图片有损压缩

图片压缩

标签:algorithm   格式   历史   body   技术分享   res   src   tree   block   

原文地址:https://www.cnblogs.com/zcat/p/tu-pian-ya-suo.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!