图片压缩

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

例子:图片有损压缩

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python io操作需要用到什么硬件_Python I/O 操作(一)

一、I/O 概念I/O 指的是相对内存而言的 input 和 output从文件、数据库、网络向内存中写入数据叫做 input从内存向文件、数据库、网络中输出数据叫做 outputI/O 操作相比 CPU 操作而言是极慢的,往往 CPU 运行一秒钟,I/O 要忙几个月,所以要提高…

fortinate防火墙使用本地用户三步开通PPTP ***

1. 建立用户Local用户及用户组 2. 启用PPTP ***拨号功能 3. 建立***地址,并设置策略:让***用户可以访问内部和外部 (注:建***地址和策略时,接口选择是外部,因为是外部拨入的) 完成上述三步&…

李国浩20179307第二周作业

人物介绍 国内知名黑客: 吴翰青:阿里云首席安全科学家、云盾负责人,也是网络安全领域为人熟知的“刺”、“道哥”和“小黑”。他要想黑谁家的网站,别说企业、医院,银行都要彻夜难眠。但小黑是白帽子,黑客最…

rust windows 交叉编译_交叉编译和静态链接 RUST 库

在 CSIS 中,我们过去使用 Python 编写后端,同时为 Incident Response Toolkit 编写一些 C/C 代码。几年前,主要是由于性能原因,我们开始用 Rust 替换 Python 重写了一些特定的后端服务,并取得了巨大的成功。现在&#…

转lua解释执行脚本流程

本文转自&#xff1a;http://www.cnblogs.com/zxh1210603696/p/4458473.html #include "lua.hpp"#include <iostream> using namespace std;#pragma comment(lib, "lua5.1.lib")struct lua_guard{lua_State *pL;lua_guard(lua_State *s) :pL(s){}~lu…

about hamout cloudra

http://running.iteye.com/?page3

(转)PowerHA完全手册(一,二,三)

PowerHA完全手册&#xff08;一&#xff09; 原文&#xff1a;http://www.talkwithtrend.com/Article/39889-----PowerHA完全手册&#xff08;一&#xff09; http://www.talkwithtrend.com/Article/40117---PowerHA完全手册&#xff08;二&#xff09; http://www.talkwithtre…

dial up network

dial up network 通过电话线拨号上网的网络系统

事件处理 java_Java事件处理的4种方法

第一种 自身类作为事件监听器import javax.swing.*;import java.awt.*;import java.awt.event.*;/***Java事件处理机制:自身类作为事件监听器*author Winty(wintysgmail.com)*version 2008-12-3*/class ThisClassEvent extends JFrame implements ActionListener{JButton btn;p…

新浪微博推出具有中国特色的“关注但屏蔽”功能

关注一个人&#xff0c;又偷偷屏蔽他&#xff0c;这项功能有人称之“虚伪”&#xff0c;有人称之“贴心”。 请听题&#xff0c;如何礼貌地回答熟人的这个问题&#xff1a;“你为什么取消了微博上对我的关注&#xff1f;”相信这是很多玩微博的人都会遇到的问题&#xff0c;取消…

linux shell 脚本个人规范总结

一、shell 语句格式 linux shell有一套自己的流程控制语句&#xff0c;其中包括条件语句(if)&#xff0c;循环语句(for,while)&#xff0c;选择语句(case)。下面我将通过例子介绍下&#xff0c;各个语句使用方法。 1.1、if语句结构[if/then/elif/else/fi] if 条件测试语句 then…

java循环基础知识_java基础知识—循环结构

1.while 循环语法&#xff1a;while(循环操作){循环操作&#xff1b;}特点:先判断&#xff0c;再执行&#xff1b;2. &#xff1a;用于数字比较 比较的是地址equals: 用于字符串比较 比较的是字符3.do-while语法&#xff1a;do{循环操作&#xff1b;}while(循环条件)&#xff…

android文件读写

public class service { private Context context;//引入上下文对象&#xff0c;要使用其中的方法openFileOutput public service(Context context) { super(); this.context context; } public void save(String filename,String content)throws Exception//抛出异…

接口的声明

C#中咩有多继承&#xff0c;为了解决多继承接口 什么是接口   接口可以理解为对一组方法声明进行统一命名&#xff0c;但是这些方法没有提供任何实现&#xff0c;也就是说&#xff0c;吧一组方法声明在一个接口中 然后继承于该接口的类都需要实现这些接口。 注意&#xff1a;…

C51编程在不同内存空间(data xdata bdata)定义变量的注意事项

1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。 因为局部变量的空间是可以覆盖的&#xff08;某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖&#xff09;,可以提高内…

java 类调用情况_java 如何调用类?情况如下

本人目录如下&#xff1a;在surge目录下有一个java文件想创建一个LBChart2DFrameDemo对象&#xff0c;不知道如何创建&#xff1f;。注意&#xff1a;LBChart2DFrameDemo使用了Chart2D.jar包中内容。这个目录ClsChart2D尚未加在...本人目录如下&#xff1a;在surge目录下有一个…

BZOJ1085: [SCOI2005]骑士精神

【传送门&#xff1a;BZOJ1085】 简要题意&#xff1a; 有一个5*5的棋盘&#xff0c;棋盘上有12个白棋子&#xff0c;12个黑棋子&#xff0c;和一个空格&#xff0c;每只棋子只能按照马走日的规则移动&#xff0c;求出最少步数达到以下状态 题解&#xff1a; DFSA* DFS很容易做…

猎豹网校 java_猎豹网校Java 零基础入门 JAVA基础视频教程(精制)

00.NetBeans_下载和安装.mp4 01.Java_语言概述.mp402.Java标识符和关键字.mp403.Java_变量和基本数据类型.mp404.Java_简单数据类型转换和类包装.mp405.Java_算术运算符表达式.mp406.Java_关系运算符和逻辑运算符.mp407.Java_位_赋值_条件运算符.mp408.Java_基本语句和跳转语句…

获取实体表相关信息

ClassMetadata meta session.getSessionFactory().getClassMetadata(clazz);//实体名称String entityName meta.getEntityName();//主键名称String pkName meta.getIdentifierPropertyName();转载于:https://blog.51cto.com/javaworker/736018

软测第二周作业WordCount

一、Github地址: https://github.com/duwei1996/wc 二、PSP2.1表格 PSP2.1 PSP阶段 预估耗时 &#xff08;分钟&#xff09; 实际耗时 &#xff08;分钟&#xff09; Planning 计划 3030 Estimate 估计这个任务需要多少时间 3030 Development 开发 540900 Analysis …