JPEG中使用了量化、哈夫曼编码等,极大的压缩了图片占用的空间,那么是否可以进一步压缩呢?
从技术角度讲,是可以的。如DropBox开源的lepton,在目前的JPEG压缩基础上,可以再节省22%左右的空间。
lepton中使用算术编码(VP8)替换哈夫曼编码,以得到更高的压缩率。算术编码90年代已经出现,但是受限于专利,没有被广泛使用。同样由于专利限制没有广泛使用的还有gif中的压缩编码lzw。
下面介绍一下,算术编码的基本原理和过程。
set Low to 0
set High to 1
while there are input symbols do
take a symbol
CodeRange = High – Low
High = Low + CodeRange *HighRange(symbol)
Low = Low + CodeRange * LowRange(symbol)
end of while
output Low
|
get encoded number
do
find symbol whose range straddles the encoded number
output the symbol
range = symbo.LowValue – symbol.HighValue
substracti symbol.LowValue from encoded number
divide encoded number by range
until no more symbols
|
符号
|
A
|
B
|
C
|
D
|
概率
|
0.1
|
0.4
|
0.2
|
0.3
|
初始编码间隔
|
[0, 0.1)
|
[0.1, 0.5)
|
[0.5, 0.7)
|
[0.7, 1]
|
步骤
|
输入符号
|
编码间隔
|
编码判决
|
1
|
C
|
[0.5, 0.7]
|
符号的间隔范围[0.5, 0.7]
|
2
|
A
|
[0.5, 0.52]
|
[0.5, 0.7]间隔的第一个1/10
|
3
|
D
|
[0.514, 0.52]
|
[0.5, 0.52]间隔的最后一个1/10
|
4
|
A
|
[0.514, 0.5146]
|
[0.514, 0.52]间隔的第一个1/10
|
5
|
C
|
[0.5143, 0.51442]
|
[0.514, 0.5146]间隔的第五个1/10开始,二个1/10
|
6
|
D
|
[0.514384, 0.51442]
|
[0.5143, 0.51442]间隔的最后3个1/10
|
7
|
B
|
[0.5143836, 0.514402]
|
[0.514384,0.51442]间隔的4个1/10,从第1个1/10开始
|
8
|
从[0.5143876, 0.514402]中选择一个数作为输出:0.5143876
|
步骤
|
间隔
|
译码符号
|
译码判决
|
1
|
[0.5, 0.7]
|
C
|
0.51439在间隔 [0.5, 0.7)
|
2
|
[0.5, 0.52]
|
A
|
0.51439在间隔 [0.5, 0.7)的第1个1/10
|
3
|
[0.514, 0.52]
|
D
|
0.51439在间隔[0.5, 0.52)的第7个1/10
|
4
|
[0.514, 0.5146]
|
A
|
0.51439在间隔[0.514, 0.52]的第1个1/10
|
5
|
[0.5143, 0.51442]
|
C
|
0.51439在间隔[0.514, 0.5146]的第5个1/10
|
6
|
[0.514384, 0.51442]
|
D
|
0.51439在间隔[0.5143, 0.51442]的第7个1/10
|
7
|
[0.51439, 0.5143948]
|
B
|
0.51439在间隔[0.51439,0.5143948]的第1个1/10
|
8
|
译码的消息:C A D A C D B
|
CodeRange = High – Low
High = Low + CodeRange *HighRange(symbol)
Low = Low + CodeRange * LowRange(symbol)
|
CodeRange = 255 - 0 = 255
High = 0 + 255 * 1/3 = 85
Low = 0 + 255 * 0 = 0
|
CodeRange = 85 - 0 = 85
High = 0 + 85 * 3/4 = 63
(向下取整)
Low = 0 + 85 * 2/4 = 43
(向上取整)
|
位移轮数
|
Total
|
Out
|
Bits
|
High
|
Low
|
1
|
7
|
0
B
|
1
|
98 (49<<1)
|
94 (47<<1)
|
2
|
7
|
00B
|
2
|
196 (98<<1)
|
188 (94<<1)
|
位移轮数
|
Total
|
Out
|
Bits
|
High
|
Low
|
1
|
8
|
0
01B
|
3
|
136
|
134
|
2
|
8
|
00
11B
|
4
|
16 (136<<1)
|
12 (134<<1)
|
3
|
8
|
00110B
|
5
|
32
|
24
|
位移轮数
|
Total
|
Out
|
Bits
|
High
|
Low
|
1
|
9
|
0
01100B
|
6
|
54
|
48
|
2
|
9
|
00
11000B
|
7
|
108
|
96
|
X = out<<8 | magic = 0011000 01101000B
|
文章浏览阅读1.4k次。1、开关飞行模式在日常使用iPhone时,偶尔会有手机信号不佳的时候,例如在一些处于跨基站位置往往会出现信号跳水不稳定的情况。这时,用户可以尝试开关飞行模式的方法,来尝试恢复手机信号。具体操作方法:第一步,先打开飞行模式。用户可以在控制中心,开启飞行模式。第二步,等待约5秒后,再关闭飞行模式。这样,有助于解决信号不好,或无信号的问题。2、手动选择运营商一般来说,iPhone会根据用户的手机卡自动接..._i phone4信号
文章浏览阅读2k次。前言Github:https://github.com/yihonglei/thinking-in-spring一Spring数据源简介Spring提供了在Spring上下文中配置数据源bean的多种方式,包括:1、通过JDBC驱动程序定义的数据源。在Spring中,通过JDBC驱动定义数据源是最简单的配置方式。Spring提供了三个这样的数据源类(均位于org.spri..._defaultreadonly
文章浏览阅读2.2k次,点赞2次,收藏2次。项目源码:https://github.com/yicaifenchen8/Java_GraphicsImage.git核心代码public class Main { public static void main(String[] args) { drawImage(); } public static void drawImage(){ ..._java graphics.fromimage
文章浏览阅读7.4k次。Spark mllib 自带了许多机器学习算法,它能够用来进行模型的训练和预测。当使用这些算法来构建模型的时候,我们需要一些指标来评估这些模型的性能,这取决于应用和和其要求的性能。Spark mllib 也提供一套指标用来评估这些机器学习模型。具体的机器学习算法归入更广泛类型的机器学习应用,例如:分类,回归,聚类等等,每一种类型都很好的建立了性能评估指标。本节主要分享分类器模型评价指标。RO..._area under precision-recall curve (auprc) 作为评价指标
文章浏览阅读2.9k次。一:前言 前段时间在编译kernel的时候发现rootfs挂载不上。相同的root选项设置旧版的image却可以。为了彻底解决这个问题。研究了一下rootfs的挂载过程。特总结如下,希望能给这部份知识点比较迷茫的朋友一点帮助。 二:rootfs的种类 总的来说,rootfs分为两种:虚拟rootfs和真实rootfs.现在kernel的发展趋势是将更多的功能放到用_linux rootfs 文件系统挂载
文章浏览阅读2.4w次,点赞12次,收藏58次。lock=0state=0alltime=0function OnEvent(event, arg) if(event=="PROFILE_ACTIVATED")then EnablePrimaryMouseButtonEvents(true) end OutputLogMessage("Event: "..event.." Arg: "..arg.."\n") if(event=="MOUSE_BUTTON_PRESSED" and arg==7 )then Out_pubg脚本
文章浏览阅读1.2k次。输入procedure TypeKeyString(s: string);var c: Char; i: integer; off: integer; vkw: Word;begin for i := 1 to Length(s) do begin c := s[i]; if (c < #128) then begin vkw := VkKeyScan(c); off := 0; if vkw and $10..._delphi windowfrompoint
文章浏览阅读3.7k次。url:http://www.myexception.cn/operating-system/1525825.html使用IOS企业版证书发布应用 苹果的企业开发证书,可以不经app store,直接发布到自己的网站上。其他人可以直接下载安装。但前提要用苹果自带的浏览器(safari)才能下载,其他浏览器不能识别该协议。 一、制作证书 打_iphone连接企业无线配置证书
文章浏览阅读914次。今天在测试cron定时任务实现rsync自动备份时,先将以下命令写入脚本~/etc_backup.sh:#!/bin/bashrsync -avz /etc [email protected]::backup然后执行crontab -e命令,在里面添加如下命令,设置每3分钟定时执行etc_backup.sh脚本,实现备份:*3/ * * * * /usr/bin/sh ~/e..._crontab不执行rsync
文章浏览阅读362次。笔者使用的Navicat Premium 12启动界面截屏:请注意是64位的。笔者win7 64位系统。连接Oracle时提示“oracle library is not loaded”。解决方法:1.前往“http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/i..._navicat换环境后报错
文章浏览阅读707次。1.用户空间的mmap系统调用void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);函数的作用:将物理内存的一块区域映射到用户空间,通过用户空间指针的操作来读写物理内存区域的数据。具体参数含义start : 指向欲映射的内存起始地址,通常设为 NULL,代表让系统自动选定地址,映_linux驱动 mmap函数实现
文章浏览阅读143次。【设计】24款线框图相关工具及资源大放送线框是一个非常有用的网页开发工具,正确使用有助于帮助Web开发者节省时间和精力!下面介绍一些常见的线框工具,希望对Web设计师有帮助。 1. 960.gs Templates for Inkscape 960个Inkscape模板集合。 2. Android Patterns _960.gs templates for inkscape