精华内容
下载资源
问答
  • LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年。LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77。鉴于其在数据压缩领域的地位,本文将结合图片和源码详细介绍其原理。原理介绍:...

    LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年。LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77。鉴于其在数据压缩领域的地位,本文将结合图片和源码详细介绍其原理。

    原理介绍:

    首先介绍几个专业术语。

    1.lookahead buffer(不知道怎么用中文表述,暂时称为待编码区):

    等待编码的区域

    2. search buffer:

    已经编码的区域,搜索缓冲区

    3.滑动窗口:

    指定大小的窗,包含“搜索缓冲区”(左) + “待编码区”(右)

    接下来,介绍具体的编码过程:

    为了编码待编码区, 编码器在滑动窗口的搜索缓冲区查找直到找到匹配的字符串。匹配字符串的开始字符串与待编码缓冲区的距离称为“偏移值”,匹配字符串的长度称为“匹配长 度”。编码器在编码时,会一直在搜索区中搜索,直到找到最大匹配字符串,并输出(o, l ),其中o是偏移值, l是匹配长度。然后窗口滑动l,继续开始编码。如果没有找到匹配字符串,则输出(0, 0, c),c为待编码区下一个等待编码的字符,窗口滑动“1”。算法实现将类似下面的:

    while( lookAheadBuffer not empty )

    {

    get a pointer (position, match) to the longest match

    in the window for the lookAheadBuffer;

    output a (position, length, char());

    shift the window length+1 characters along;

    }

    主要步骤为:

    1.设置编码位置为输入流的开始

    2.在滑窗的待编码区查找搜索区中的最大匹配字符串

    3.如果找到字符串,输出(偏移值, 匹配长度), 窗口向前滑动“匹配长度”

    4.如果没有找到,输出(0, 0, 待编码区的第一个字符),窗口向前滑动一个单位

    5.如果待编码区不为空,回到步骤2

    描述实在是太复杂,还是结合实例来讲解吧

    实例:

    现在有字符串“AABCBBABC”,现在对其进行编码。

    一开始,窗口滑入如图位置

    lz77-lossless-data-compression-algorithms.html

    由图可见,待编码缓冲区有“AAB”三个字符,此时搜索缓冲区还是空的。所以编码第一个字符,由于搜索区为空,故找不到匹配串,输出(0,0, A),窗口右移一个单位,如下图

    lz77-lossless-data-compression-algorithms.html

    此时待编码区有“ABC”。开始编码。最先编码”A”,在搜索区找到”A”。由于没有超过待编码区,故开始编码”AB”,但在搜索区没有找到匹配字符串,故无法编码。因此只能编码”A”。

    输出(1, 1)。即为相对于待编码区,偏移一个单位,匹配长度为1。窗口右滑动匹配长度,即移动1个单位。如下图

    lz77-lossless-data-compression-algorithms.html

    一样,没找到,输出(0, 0, B),右移1个单号,如下图

    lz77-lossless-data-compression-algorithms.html

    输出(0, 0, C),右移1个单位,如下图

    lz77-lossless-data-compression-algorithms.html

    输出(2, 1),右移1个单位,如下图

    lz77-lossless-data-compression-algorithms.html

    输出(3, 1), 右移1个单位,如下图

    lz77-lossless-data-compression-algorithms.html

    开始编码”A”,在搜索缓冲区查找到匹配字符串。由于待编码缓冲区没有超过,继续编码。 开始编码”AB”,也搜索到。不要停止,继续编码“ABC”,找到匹配字符串。由于继续编码,则超过了窗口,故只编码“ABC”,输出(5, 3),偏移5,长度3。右移3个单位,如下图

    lz77-lossless-data-compression-algorithms.html

    此时待编码缓冲区为空,停止编码。

    最终输出结果如下

    lz77-lossless-data-compression-algorithms.html

    python代码实现:

    class Lz77:

    def __init__(self, inputStr):

    self.inputStr = inputStr #输入流

    self.searchSize = 5    #搜索缓冲区(已编码区)大小

    self.aheadSize = 3     #lookAhead缓冲区(待编码区)大小

    self.windSpiltIndex = 0 #lookHead缓冲区开始的索引

    self.move = 0

    self.notFind = -1   #没有找到匹配字符串

    #得到滑动窗口的末端索引

    def getWinEndIndex(self):

    return self.windSpiltIndex + self.aheadSize

    #得到滑动窗口的始端索引

    def getWinStartIndex(self):

    return self.windSpiltIndex - self.searchSize

    #判断lookHead缓冲区是否为空

    def isLookHeadEmpty(self):

    return True if self.windSpiltIndex + self.move> len(self.inputStr) - 1   else False

    def encoding(self):

    step = 0

    print("Step   Position   Match   Output")

    while not self.isLookHeadEmpty():

    #1.滑动窗口

    self.winMove()

    #2. 得到最大匹配串的偏移值和长度

    (offset, matchLen) = self.findMaxMatch()

    #3.设置窗口下一步需要滑动的距离

    self.setMoveSteps(matchLen)

    if matchLen == 0:

    #匹配为0,说明无字符串匹配,输出下一个需要编码的字母

    nextChar = self.inputStr[self.windSpiltIndex]

    result = (step, self.windSpiltIndex, '-',  '(0,0)' + nextChar)

    else:

    result = (step, self.windSpiltIndex, self.inputStr[self.windSpiltIndex - offset: self.windSpiltIndex - offset + matchLen], '(' + str(offset) + ',' + str(matchLen) + ')')

    #4.输出结果

    self.output(result)

    step = step + 1        #仅用来设置第几步

    #滑动窗口(移动分界点)

    def winMove(self):

    self.windSpiltIndex = self.windSpiltIndex + self.move

    #寻找最大匹配字符并返回相对于窗口分界点的偏移值和匹配长度

    def findMaxMatch(self):

    matchLen = 0

    offset = 0

    minEdge = self.minEdge() + 1  #得到编码区域的右边界

    #遍历待编码区,寻找最大匹配串

    for i in range(self.windSpiltIndex + 1, minEdge):

    #print("i: %d" %i)

    offsetTemp = self.searchBufferOffest(i)

    if offsetTemp == self.notFind:

    return (offset, matchLen)

    offset = offsetTemp #偏移值

    matchLen = matchLen + 1  #每找到一个匹配串,加1

    return (offset, matchLen)

    #入参字符串是否存在于搜索缓冲区,如果存在,返回匹配字符串的起始索引

    def searchBufferOffest(self, i):

    searchStart = self.getWinStartIndex()

    searchEnd = self.windSpiltIndex

    #下面几个if是处理开始时的特殊情况

    if searchEnd < 1:

    return self.notFind

    if searchStart < 0:

    searchStart = 0

    if searchEnd == 0:

    searchEnd = 1

    searchStr = self.inputStr[searchStart : searchEnd]  #搜索区字符串

    findIndex = searchStr.find(self.inputStr[self.windSpiltIndex : i])

    if findIndex == -1:

    return -1

    return len(searchStr) - findIndex

    #设置下一次窗口需要滑动的步数

    def setMoveSteps(self, matchLen):

    if matchLen == 0:

    self.move = 1

    else:

    self.move = matchLen

    def minEdge(self):

    return len(self.inputStr)  if len(self.inputStr) - 1 < self.getWinEndIndex() else self.getWinEndIndex() + 1

    def output(self, touple):

    print("%d      %d           %s     %s" % touple)

    if __name__ == "__main__":

    lz77 = Lz77("AABCBBABC")

    lz77.encoding()

    只是简单的写了下,没有过多考虑细节,请注意,这不是最终的代码,只是用来阐述原理,仅供参考。输出结果就是上面的输出。

    参考文章:

    以上几篇文章都是很好的讲解LZ77原理的,大家有兴趣的可以参考下。由于国内介绍该算法的比较少,故这些英文文章帮助还是挺大的。

    展开全文
  • 图片无损压缩 图片无损等比例缩放 14MB的图片 压缩到 80% 之后 剩余100KB左右
  • 无损压缩算法专题——无损压缩算法介绍

    千次阅读 多人点赞 2019-12-22 19:50:21
    一、数据无损压缩的理论——信息论 数据压缩的起源是基于信息论的。信息论之父香农第一次用数学语言阐明了概率与信息冗余度的关系。在1948年发表的论文“通信的数学理论”中,香农指出,任何信息都存在冗余,冗余...

    一、数据无损压缩的理论——信息论

    数据压缩的起源是基于信息论的。信息论之父香农第一次用数学语言阐明了概率与信息冗余度的关系。在1948年发表的论文“通信的数学理论”中,香农指出,任何信息都存在冗余,冗余大小与信息中每个符号的出现概率有关。香农借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。这篇伟大的论文后来被誉为信息论的开山之作,信息熵也奠定了所有数据压缩算法的理论基础。从本质上讲,数据压缩的目的就是要消除信息中的冗余,而信息熵及相关的定理恰恰用数学手段精确地描述了信息冗余的程度。利用信息熵公式,人们可以计算出信息编码的极限。即在一定的概率模型下,无损压缩的编码长度不可能小于信息熵公式给出的结果。下面是这位帅气的美国数学家的照片,记得大学上课的时候老师PPT摆的是他年轻时的照片,周围同学一个劲地夸他帅,哈哈。

     

    信息量定义:     

           设信源x由属于集合Am={a1,a2,…,am}的m个可能的符号产生,若信源事件aj的概率为P(aj),则定义事件aj的信息量I(aj):

                                                                                        I(aj)=-log P(aj)

      取2为底的对数,则单位为比特(bit),信息量也称自信息。

    信源的熵:

           一个通信系统并非只传送1个符号,而是多个符号,这就需要定义整个信源符号的平均信息量的大小。我们把自信息的统计平均值——数学期望,称为信源x的熵。熵的大小表示非冗余的不可压缩的信息量。

     

    以上的理论和公式和理论大家只作为一个了解,其实还是很有用的,我们可以根据香农的理论来计算一个特定文件的极限压缩率。

     

    二、数据压缩的必要性及分类

    当今信息技术飞速发展。由于数字化的多媒体信息尤其是数字视频和音频信号的数据量特别庞大,如果不对其进行有效的压缩就难以得到实际的应用。像我们平常看的视频和听的音乐都是经过压缩的,最直观的感受就是看视频的时候有蓝光超清、720P等等的清晰度可以选择。MP3也有无损音质和各种有损等级的区别。如果不对数据进行压缩,那么我们平常接触到的大部分文件都是非常庞大的,像视频直播这样的技术应用都会遇到很大的阻碍,所以数据压缩是非常有必要的。

           那么问题来了,数据可以被无限压缩吗?答案可定是不能的,我们平时都会发现,被压缩过的文件就很难再被压缩了,从本质上讲,数据压缩的目的就是要消除信息中的冗余,数据压缩只不过是把海绵中的水挤压出来,再怎么用力都无法把海绵都挤的消失。

    下面我们来看看数据压缩的分类:

    无损压缩:完全还原被压缩的数据,适用于普通文件和可执行文件等不能容忍数据丢失的场合,压缩率比较小。

    有损压缩:不能完全还原被压缩的数据,适用于多媒体文件等可容忍一定数据丢失的场合,压缩率比较大。

    为什么数据压缩分为这么多的种类,统一用一种压缩算法不行吗?当然是不行的,因为面向不同的应用场合是有不同的应用需求的,一种算法在这种场合好用并不代表在另外一个场合就一定也好用,所谓“术业有专攻”说的就是这个道理。既然分为那么多的种类,就必然需要一些定性的指标来评判一个压缩算法的好坏。下面是一些压缩算法的性能指标:

    压缩比:压缩前的数据大小和压缩后的数据大小之比。

    数据质量:无损压缩不存在数据质量问题,而有损压缩数据失真情况很难量化,只能对测试的数据进行估计。

    软硬件系统:有些硬件系统有数据压缩模块,与软件系统相比速度快更快。但软件系统灵活度更高。

    压缩/解压速度:不同场合对速度性能有不同的要求。

     

    三、压缩编码

    (1)香农-范诺编码(Shannon–Fano coding)

           最早阐述和实现“从上到下”的熵编码方法的人是Shannon(1948)Fano(1949),因此称为香农-范诺(Shannon- Fano)编码法。编码步骤如下:

     

    编码举例

           现有A,B,C,D和E共5类符号,出现的次数如下表,试着对这40个符号进行香农范诺编码:

     通常情况下每个符号需要用3个比特位来编码表示,现在对这些符号进行香农-范诺编码。

    ①根据符号出现的概率对符号进行降序排列后,分出最均匀的两部分,然后在中间画一条红线分开两部分。可能有人会问最均匀是怎么判定的,简单的一个判定就是这两部的“出现次数”差值最小。举个例子,从B和C间划开两部分后第一部分“出现次数”为15+7=22,第二部分为7+6+5=18,差值为22-18=4;若从C、D间划开两部分后第一部分“出现次数为”15+7+7=29,第二部分为6+5=11,差值为29-11=18;显然从B和C间划开是差值最小的,所以从这里划开。

    划开两部分之后第一部分分配一个比特位0,第二部分分配一个比特位1,如下表所示:

    ②以此类推,将上一次分出来的各部分再进行划分,继续分配相应的比特位,于是可以得到如下的表格:

     

     ③于是得出了每个符号应该分配的编码A(00)、B(01)、C(10)、D(110)、E(111),接下来就可以对比一下压缩性能了。

    压缩前编码位数:N1 = 40 x 3 = 120

    压缩后编码位数:N2 = 30 + 14 + 14 + 18 + 15 = 91

    压缩率: (120-91) / 120 ≈ 24.2%

    问题思考:假设现在就有一个这样的文本文件等待我们去压缩,我们把这些字符统计一番然后编码后,我们再去解压的时候会遇到一个什么样的问题呢?在突然对一个文件进行解压的时候,很明显在解压的时候根本就不知道每个字符是对应什么样的编码的,就没法解压啦。所以我们需要在解压的时候知道对应关系,那么自然就需要在压缩的时候把对照表写到压缩文件里面去,告诉解压时程序每个编码对应应该解释出什么字符,类似于下图这样。

     

    译码过程

          既然讲了编码肯定也要讲讲解压文件时怎么去译码,译码时需要先获取编码码表得知每种编码所对应的真实字符,然后进行译码,因为香农-范诺编码属于前缀码,即任意一个字符的编码都不可能是另外一个字符的前缀,所以译码过程中不会导致出错。下面举个例子来理解。 

    我们读取这个解压文件的编码对照表,得出如下的表格:

    大家很容易发现一个问题,两位二进制有4种组合方式“00”、“01”、“10”、“11”,为什么编码的时候上面只用了三种却没用“11”这种组合?原因很简单,我们可以先假设有“11”这种组合的码字而且它代表的字符是“F”,那么问题来了,当译码的时候读到“11”这两个比特的数据时,我到底译码成“F”这个字符还是继续向后再读一位比特位去译码成“D”或者“E”呢?所以这里就有个冲突问题,“前缀码”的引入就是为了解决这个问题。

    理解了“前缀码”的概念之后,我们开始读取数据进行解压译码,从茫茫的数据流中,我们先读到“110”,发现表里能匹配上,然后译码成“D”,再读再与表里的字符进行匹配,依此类推,直到把整个文件数据全部解压完。

     到这里整个过程就已经结束了,有个问题还是要说下,如果保存的压缩数据中有个别比特位反转,对整体数据会有什么样的影响呢?我们假设以上的数据中某个位反转,发现之后的大片数据可能都会译码错误。究其原因是因为每个字符的编码长度是不一致的,所以出现这种状况会有很大影响,

     

    (2)霍夫曼编码(Huffman coding)

           一种 “从下到上”的编码方法。待编码的元素出现的次数越多,其编码的位数就越少,霍夫曼编码被广泛用在JPEG, MPEG, H.26X等各种信息编码标准中。编码步骤如下图:

    编码举例

           试着对有30个符号的字符串:BABACACADADABBCBABEBEDDABEEEBB,进行霍夫曼编码。

     ①首先我们照符号出现先统计一下这些字符的信息,如下表:

     ②将这些符号按概率大小降序排列,然后选择两个概率最小的符号,这里明显是C和D,组成一个节点P1,后面跟上一个小括号里面填上权重为3+4=7,如下图所示:

     ③根据上一次的结果,存在B、A、E、P1这4个节点,然后再选出两个权重(次数)最小的符号,即E和P1,然后构成新的节点P2,同样后面写上权重为5+7=12,依此类推,操作到最后只剩下一个节点为止。如下面两幅图所示:

     

     ④接下来分配码字,给每一条节点与节点之间的连线都要分配一个比特位,分配规则是给权重小的分配0,另一个权重大的分配1,如下图所示,其实0和1互换过来分配也是可以的,这没什么关系。

     ⑤从右往左顺着字符的枝节读下去就是该字符应该分配的码字了,A(10)、B(11)、C(010)、D(011)、E(00)。译码方法和前面介绍的香农范诺编码是类似的。学过数据结构的朋友肯定能看出来,这其实就是一颗二叉树,只不过转了90度而已,霍夫曼编码采用最优二叉树的形式进行编码,是理论上的最优前缀编码。

     

    (3)行程长度编码(Run-Length Coding)

            计算出相同值重复出现的次数,对相同的数据只编码一次。在JPEG,MPEG,H.261和H.263等压缩方法中,RLE用来对图像数据变换和量化后的系数进行编码。

     这种编码方式有个很明显的缺陷,当待编码的数据中重复块很少时,这种编码方式会使得压缩后的数据比原始数据还要大,所以在实际应用中都会做相应的改进。

     

    四、词典编码

    (1)词典编码的概念和分类

    词典编码的实质就是用一些短的索引来替换重复出现的数据段。LZ系列算法是最具代表性的词典编码算法。同样,举个生动形象的例子:

     看到第一行写的是“吃葡萄不吐葡萄皮”,聪明的你一定猜到下面一行写的是“不吃葡萄倒吐葡萄皮”了。为什么我下面一行没写字上去大家也能知道是什么内容?因为每个图形都代表了一串特定的字符,词典编码也是这个道理。再举个程序员懂的例子,C语言中用一个指针来指向一个字符串,我们输出字符串的时候只需要知道这个指针就行了,那么这个指针就是代表了这一大串的字符,就相当于是数据压缩了。

    第一类编码算法

    ①用已经出现过的字符串替代重复的部分。

    ②编码器的输出仅仅是指向早期出现过的字符串的“指针”。

    第二类编码算法

       ①从输入的数据中创建一个“短语词典

       ②编码器输出词典中的短语“索引号”。

     

    (2)LZSS算法原理(第一类编码)

           LZSSLZ77改进而来,又称“滑动窗口压缩”,该算法将一个虚拟的,可以跟随压缩进程滑动的窗口作为词典,要压缩的字符串如果在该窗口中出现,则输出其出现位置和长度,没出现则原样输出字符。

     编码步骤

     

    编码格式      

           如果匹配串的长度比指针本身的长度长就输出指针,否则就输出真实字符。由于输出的压缩数据流中包含有指针和字符本身,为了区分它们就需要有额外的标志位。下面举个例子,只是做个示例,实际应用不一定这么用。

     我们假设编码格式为8个字节一组,第1字节用来做标记,标记后面7个数据哪些是真实的数据,哪些是指针。

    蓝色部分的是真实数据,直接输出就可以了,后面的0x03 0x03为一组,表示在前向缓冲区的第3个数据处开始匹配3个字符,于是匹配到0x41、0x42、0x43,接下来两个数据一样的道理。 最后解压出来如下图的数据。

     举个完整过程的例子:

     

    (3)LZW算法原理(第二类编码) 

    LZW由LZ78的改进而来,编/译码过程就是不断往“字典”中添加新的数据串,并且对新的数据串进行编号,输入是字符流,输出是“字典”中的序号。

    LZW编码步骤 

    P:数据串前缀,      C:当前字符,          PC:P和C字符串的连接。

     

     (4)LZ系列算法比较 

    五、总结 

    压缩算法种类繁多,需要针对不同的场合选择不同的算法,没有最好,只有最适合的算法。写到这里也很累了现在,在这一篇只做算法的介绍,之后的一段时间里会逐步用代码去实现以上所述的算法,并研究在实际项目中的灵活运用。

    展开全文
  • 主要介绍了Python无损压缩图片的方法,简单的代码即可实现压缩图片,感兴趣的朋友可以了解下
  • 本文实例为大家分享了C#无损.../// 无损压缩图片 /// 原图片 /// 压缩后保存位置 /// 高度 /// <param name=dWidth></param> /// 压缩质量(数字越小压缩率越高) 1-100 /// <returns></returns> public static bool Get
  • 无损压缩经典算法

    千次阅读 2018-06-12 10:02:41
    https://blog.csdn.net/cordova/article/details/52928432
    展开全文
  • 朋友开了网店,想让我帮忙做一些小工具,其中就包含了图片无损压缩的需求,这一类的软件和代码在网上有很多,但是真正实用的符合自己定制化需求的没几个,于是就想着自己DIY一下(自己动手丰衣足食^o^),并贴出核心...

    朋友开了网店,想让我帮忙做一些小工具,其中就包含了图片无损压缩的需求,这一类的软件和代码在网上有很多,但是真正实用的符合自己定制化需求的没几个,于是就想着自己DIY一下(自己动手丰衣足食^o^),并贴出核心代码供大家学习和参考

            /// <summary>
            /// 无损压缩图片
            /// </summary>
            /// <param name="sFile">原图片地址</param>
            /// <param name="dFile">压缩后保存图片地址</param>
            /// <param name="flag">压缩质量(数字越小压缩率越高)1-100</param>
            /// <returns></returns>
            public static bool CompressImage(string sFile, string dFile, int flag = 90)
            {
                Image iSource = Image.FromFile(sFile);
                ImageFormat tFormat = iSource.RawFormat;
    
                int dHeight = iSource.Height / 2;
                int dWidth = iSource.Width / 2;
                int sW, sH;
                //按比例缩放
                Size tem_size = new Size(iSource.Width, iSource.Height);
                if (tem_size.Width > dHeight || tem_size.Width > dWidth)
                {
                    if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))
                    {
                        sW = dWidth;
                        sH = (dWidth * tem_size.Height) / tem_size.Width;
                    }
                    else
                    {
                        sH = dHeight;
                        sW = (tem_size.Width * dHeight) / tem_size.Height;
                    }
                }
                else
                {
                    sW = tem_size.Width;
                    sH = tem_size.Height;
                }
    
                Bitmap ob = new Bitmap(dWidth, dHeight);
                Graphics g = Graphics.FromImage(ob);
    
                g.Clear(Color.WhiteSmoke);
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    
                g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
    
                g.Dispose();
    
                //以下代码为保存图片时,设置压缩质量
                EncoderParameters ep = new EncoderParameters();
                long[] qy = new long[1];
                qy[0] = flag;//设置压缩的比例1-100
                EncoderParameter eParam = new EncoderParameter(Encoder.Quality, qy);
                ep.Param[0] = eParam;
    
                try
                {
                    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo jpegICIinfo = arrayICI.FirstOrDefault(t => t.FormatDescription.Equals("JPEG"));
                    if (jpegICIinfo != null)
                    {
                        ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径
                    }
                    else
                    {
                        ob.Save(dFile, tFormat);
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
                finally
                {
                    iSource.Dispose();
                    ob.Dispose();
                }
            }

     

    转载于:https://www.cnblogs.com/guyun/p/8027797.html

    展开全文
  • 高质量无损图片压缩算法 using System.Drawing; using System.Drawing.Imaging; using System.IO; namespace CompressImageHelper { public class CompressImage { /// <summary> ...
  • 无损编码/压缩算法: 问题1: 实现行程编码压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析; 问题2: 实现哈夫曼压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并...
  • 简单介绍Thumbnailator是一个用来生成图像缩略图的 Java类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。有了这玩意,就不用在费心思使用Image I/O API,Java 2D API等等来生成...
  • 常用的无损压缩算法有:1、LZ77算法,该算法是很多其他无损压缩算法的基础;2、LZR算法,是旨在提升LZ77的一个算法;3、LZSS算法,该算法目标是成为LZ77的一个线性时间替换算法;4、DEFLATE算法;5、LZMA算法等等。...
  • Snappy ...Snappy同时针对64位x86处理器进行了优化,在英特尔酷睿i7处理器单一核心实现了至少250MB/s的压缩性能和500MB/ s的解压缩性能。Snappy对于纯文本的压缩率为1.5-1.7,对于HTML是2-4,当然了对于
  • 无损压缩算法专题——RLE算法实现

    千次阅读 2020-01-04 23:16:29
    本文是基于我的另一篇博客《无损压缩算法专题——无损压缩算法介绍》的基础上来实现的,RLE算法最简单的理解就是用(重复数,数据值)这样一个标记来代替待压缩数据中的连续重复的数据,以此来达到数据压缩的目的。...
  • 一个简单的图片压缩算法的源代码

    热门讨论 2008-07-11 17:41:49
     最近在研究图像压缩,其他经典的算法都还没看,先按照自己的想法搞了一个简短的图像压缩算法。算法原理很简单:取一个点,然后把这个点之后的n个与该点差别不大的点个数数出来,然后存储为像素+n的格式,这样...
  • android经典图片压缩算法 永不失真

    千次下载 热门讨论 2013-12-19 10:21:56
    对各种大图片进行压缩压缩不失真。大图片压缩后大小在100k以内,可以根据自己的需求进行设置压缩大小。
  • FPGA实现JPEG-LS无损压缩算法

    千次阅读 2017-09-14 14:46:39
    其原因就是取决于是使用无损压缩模式还是近无损压缩模式,如果是无损压缩模式,重建值是等于原像素值的(例Ra=Ia);而在近无损压缩模式中,重建值与原像素值可能有差别,那么是必须使用重建值进行计算的(否则解码...
  • 本人收集的基于matlab的各种压缩算法程序,包括lzw,huffman,dpcm,diffcoding,jpeg等 (Based on a variety of compression algorithms matlab program I collected, including lzw, huffman, dpcm, diffcoding, ...
  • JPEG无损压缩 一. 前言 续接JPEG有损压缩流程实现接下来简单实现一下无损压缩的主要思想 二. 流程 无损压缩使用的逻辑是“预测”。由于“量化”一步骤是有损压缩中导致主要误差的一部分,因此在无损压缩中,不能够...
  • js压缩算法

    2013-01-20 22:37:59
    对静态图片压缩 js压缩算法
  • public classImageCompressUtil {/*** 创建图片缩略图(等比缩放) * *@paramsrc * 源图片文件完整路径 *@paramdist * 目标图片文件完整路径 *@paramwidth * 缩放的宽度 *@paramheight * 缩放的高度*/ public static ...
  • 在CSDN上看到了一个压缩算法:C#无损高质量压缩图片代码 进过测试这个算法,发现,将原始图像的大小进行对半处理,然后迭代跳转压缩质量参数,可以得到不错的效果。 修改后的算法如下: /// /// 无损压缩图片 /// ...
  • 文件系统的无损压缩算法miniLZO

    千次阅读 2016-09-27 10:54:34
    弄文件系统,为了减少空间,可能...(1)几个常用快速无损压缩算法性能比较 (2)STM32移植 MINI LZO2.09压缩算法 下载 (3)LZO官方网站 (4)百度快照 (5)miniLZO压缩库使用注意事项(good,很容易忽视啊!!!)...
  • Huffman算法也是一种无损压缩算法,但与LZW压缩算法不同,Huffman需要得到每种字符出现概率的先验知识。通过计算字符序列中每种字符出现的频率,为每种字符进行唯一的编码设计,使得频率高的字符占的位数短,而频率...
  • 这里无损画质压缩图片的原理是什么? 现在手机拍的照片都很大,一张照片至少都在1MB以上,如果照片包含的景色较为丰富,图片都可能突破5MB以上,这里用我拍的一张风景图为例 接着我用win10自带的图片工具打开看...
  • 无损压缩 无损压缩的压缩比相对较小,一般只能获得1-5倍的压缩比。常见的图像无损压缩编码方法主要有霍夫曼编码、算术编码、行程编码和LZW编码。 以上四种编码都属于统计编码的范畴,消除的是编码冗余,而预测编码...
  • 无损数据压缩算法的历史

    万次阅读 多人点赞 2014-09-20 00:00:24
    有两种主要的压缩算法: 有损和无损。有损压缩算法通过移除在保真情形下需要大量的数据去存储的小细节,从而使文件变小。在有损压缩里,因某些必要数据的移除,恢复原文件是不可能的。有损压缩主要用来存储图像和音频...
  • 无损压缩算法发展

    千次阅读 2016-06-14 21:03:20
    History of Lossless Data Compression Algorithms Introduction There are two major categories of compression algorithms: lossy and lossless. Lossy compression algorithms involve the redu
  • 1、miniLZO是采用C编写的无损压缩库。 2、提供了快速压缩和超快速解压缩能力。 3、比较耗内存,需要64KB内存用于压缩,对于H7这种大内存的,非常合适。或者有外置SRAM/SDRAM的也比较合适,相比内部RAM就是速度稍慢...
  • 有一个列表加载封面图片 , 只做一个封面显示 , 无实际观察意义,但是图片的原图很大 , 造成资源加载浪费,所以按照比例压缩文件 import com.sun.image.codec.jpeg.JPEGCodec; import ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,763
精华内容 3,105
关键字:

图片无损压缩算法