博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片压缩
阅读量:4308 次
发布时间:2019-06-06

本文共 1022 字,大约阅读时间需要 3 分钟。

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

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

2)图片文件的格式

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

原始颜色数据

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

3)图片无损压缩原理

Sliding Window Algorithms

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

Dictionary Algorithms

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

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

转载于:https://www.cnblogs.com/zcat/p/tu-pian-ya-suo.html

你可能感兴趣的文章
ios设备唯一标识获取策略
查看>>
获取推送通知的DeviceToken
查看>>
Could not find a storyboard named 'Main' in bundle NSBundle
查看>>
CocoaPods安装和使用教程
查看>>
Beginning Auto Layout Tutorial
查看>>
block使用小结、在arc中使用block、如何防止循环引用
查看>>
iPhone开发学习笔记002——Xib设计UITableViewCell然后动态加载
查看>>
iOS开发中遇到的问题整理 (一)
查看>>
Swift code into Object-C 出现 ***-swift have not found this file 的问题
查看>>
为什么你的App介绍写得像一坨翔?
查看>>
RTImageAssets插件--@3x可自动生成@2x图片
查看>>
iOS开发的一些奇巧淫技
查看>>
常浏览的博客和网站
查看>>
Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
查看>>
iOS在Xcode6中怎么创建OC category文件
查看>>
5、JavaWeb学习之基础篇—标签(自定义&JSTL)
查看>>
8、JavaWEB学习之基础篇—文件上传&下载
查看>>
reRender属性的使用
查看>>
href="javascript:void(0)"
查看>>
h:panelGrid、h:panelGroup标签学习
查看>>