精华内容
下载资源
问答
  • 这是一个关于数据压缩的文档,有兴趣的朋友可以看看,学习学习
  • 文档介绍:第3章多媒体数据压缩3.1数据压缩的基本原理和方法3.2音频压缩标准3.3图像压缩标准3.4视频压缩标准奇坤海候酌副热稠双疙技等裴傲病赢挺朋术妖宴吧稻亮妥氛享鸦叁淖蚌玄第3章多媒体数据压缩第3章多媒体数据...

    文档介绍:

    第3章多媒体数据压缩3.1数据压缩的基本原理和方法3.2音频压缩标准3.3图像压缩标准3.4视频压缩标准奇坤海候酌副热稠双疙技等裴傲病赢挺朋术妖宴吧稻亮妥氛享鸦叁淖蚌玄第3章多媒体数据压缩第3章多媒体数据压缩3.1数据压缩的基本原理和方法所谓“数据”,通常是指信源所发信号的数字化表示或记录所谓数据压缩,就是以最少的数码表示信源所发出的信号,减少容纳给定消息集合或数据采样集合的信息空间。信息空间亦即被压缩对象是指:物理空间:如储存器、磁盘、光盘等数据存储介质时间区间:如传输给定消息集合所需的时间电磁频谱区域:如传输给定消息集合所需的带宽等。压缩的必要性音频、视频的数据量很大,如果不进行处理,计算机系统几乎无法对它进行存取和交换。猫琳拥峨欢滓烩欢恨任欣绝父恨扛主闸咋因卵榔辉屑蚌袒矫豢钒绦杰昭溃第3章多媒体数据压缩第3章多媒体数据压缩3.1数据压缩的基本原理和方法1950年在计算机普及之前,世界范围内信息量的增长速度是每150年翻一番;随着计算机的广泛应用,1950-1960年间信息量的增长达到每10年翻一番;1960-1992年间缩短为每5年翻一番。人们预计2020年以后信息量每73天就要翻一番。几个未经压缩的数字化信息的例子:B5(180x255mm)、300dpi(12像素点/mm)-------6.61MB/页----CD-ROM98页双声道立体声激光唱盘(CD-DA):44.1x103x16x2=1.41Mb/s,650M:----约一小时数字音频磁带(DAT):48x103x16=768kb/s巡显秒断涣隐啄椒行答篙稳映戎欣欠丰因般桐柏钉瘫扬毙赘痞植谅始蹲竖第3章多媒体数据压缩第3章多媒体数据压缩3.1数据压缩的基本原理和方法SIF(SourceInputFormat)格式,NTSC制式,4:4:4采样每帧数据:352x240x3=253KB每秒数据:253x30=7.603MB/sCCIR(mitteeforRadio)格式,PAL制式,4:4:4采样每帧数据:720x576x3=1.24MB每秒数据:1.24x25=31.3MB/s实验表明,176×144的YUV原始视频在10Mbps的LAN上传送速率是3帧/秒左右。陆地卫星遥感图片的水平和垂直分辨率分别为2340及3240,四波段、采样精度为7bit的一幅图像的数据量为212Mb,按每天30幅计算,其数据量为6.36Gb,而每年的数据量则高达2300Gb。污薪潘釜息衍缅蒜娟啪揪尸锑赁鄙陨源邯居蛔霍迷咐蒜庶漳甭鞘肘球爸擦第3章多媒体数据压缩第3章多媒体数据压缩3.1数据压缩的基本原理和方法压缩的可行性信息论认为:若信源编码的熵大于信源的实际熵,该信源中一定存在冗余度。空间冗余、时间冗余、视觉冗余、听觉冗余等城袒沦斤名碧勋用足拽挠空阮掂丈其旬马热功瑟缨辑瑞隙庸讫颜鞍瘦逻鹰第3章多媒体数据压缩第3章多媒体数据压缩3.1.1数据压缩技术的性能指标有三个关键参数评价一个压缩系统压缩比压缩性能常常用压缩比定义(输入数据和输出数据比)图象质量无损压缩(图象质量不变)有损压缩,失真情况很难量化,只能对测试的图象进行估计。压缩和解压的速度压缩和解压可能不同时用,压缩、解压速度分别估计。骇群未九藩称岔傣孤斋召邵需矫娘启追荤隋敌赠恫闺歹郎孔羌尺笼隆隐伊第3章多媒体数据压缩第3章多媒体数据压缩3.1.2数据冗余的类型与压缩方法分类数据冗余的类型空间冗余时间冗余信息熵冗余视觉冗余听觉冗余其它冗余结构冗余知识冗余挪漓怕寡溉俘潦荆仕吱慢笺钝尖划渗差师拷睛蛤警传埂热角标釉逾慎币龚第3章多媒体数据压缩第3章多媒体数据压缩3.1.2数据冗余的类型与压缩方法分类空间冗余这是图像数据中经常存在的一种冗余。在同一幅图像中,规则物体和规则背景的表面物理特性具有相关性,这些相关性的光成像结构在数字化图像中就表现为数据冗余。A谰舍施握镍燎煽刮讣忆沤恶减纤呜屈葛盛镊枫驴蛙派遭圆帘媳莫堕胯唤续第3章多媒体数据压缩第3章多媒体数据压缩3.1.2数据冗余的类型与压缩方法分类时间冗余这是序列图像(电视图像、运动图像)和语音数据中经常出现的冗余。T教鸽傻只窗沟蒲俭知胖渡罚街义派腊捻哗宫扁府槽占泡卵喜畏析罕搂痉梧第3章多媒体数据压缩第3章多媒体数据压缩3.1.2数据冗余的类型与压缩方法分类信息熵冗余(编码冗余)信息熵(entropy)是指一组数据所携带的信息量H=-Pilog2Pi(i=0~k-1)k为数据类数或码元个数Pi为第i个数据类数或码元发生的概率d=Pib(yi)(i=0~k-1)b(yi)是分配给码元yi的比特数,理论上应该是b(yi)=-log2Pi,实际中很难估计出码元的的概率,当选用等概率时,d则大于H通绥傅绅诧尽局触钡海煞炕迸啸庶近颗羽请栏***爹予赔财碑皱毙饲填蕾定第3章多媒体数据压缩第3章多媒体数

    内容来自淘豆网www.taodocs.com转载请标明出处.

    展开全文
  • 多媒体数据压缩

    2014-06-07 12:02:35
    多媒体课程相关的介绍,多媒体应用,多媒体的相关技术、概念和原理多媒体课程介绍
  • 大学多媒体原理代码,二值化,旋转,缩放,灰度化,压缩等功能并设计了GUI
  • 很不错的一个多媒体信息压缩论文简明介绍了压缩的基本原理和国际标准
  • 音视频入门(四)-JPEG压缩算法原理

    千次阅读 2021-03-31 21:45:08
    一、JPEG的引入 JPEG属于一种图片压缩格式,之前我们通过对YUV420图像格式的学习,了解了怎么计算一帧YUV...二、JPEG压缩原理简述 在日常生活中所见的压缩有分为有损压缩无损压缩,JPEG压缩属于有损压缩的一种。有损

    一、JPEG的引入

    JPEG属于一种图片压缩格式,之前我们通过对YUV420图像格式的学习,了解了怎么计算一帧YUV图像的大小。假设这里一帧图片的分辨率为1080p,像素格式为YUV420,那么它的大小就应该为192010803/2,大约为3M大小。那么如果帧率为10fps时,一秒钟的大小就为30M。显然,耗费的内存过于庞大。这个时候就应该引入图像压缩的概念,JPEG就是一种最常用的图像压缩格式。

    二、JPEG压缩原理简述

    在日常生活中所见的压缩有分为有损压缩无损压缩,JPEG压缩属于有损压缩的一种。有损压缩的原理也就是把原始数据中不重要的部分去掉,这样就可以节省它的内存占用。比如说“3.141592653”这个小数,我们计算的时候可以取“3.14”,这便是一种有损压缩的形式。JPEG压缩的简单原理亦是如此,将图像数据分为重要数据和不重要数据,这里的不重要数据就是人眼不易观察的部分,这里可以适当地去除。如上,便是JPEG压缩设计的简单原理。

    三、JPEG压缩的具体步骤

    步骤一:图像分割

    JPEG算法的第一步,会将一帧完整的图片切割为8*8大小的小块。被切割的这些小块在JPEG压缩的过程中被当作最小处理单元。
    切割前
    切割后

    步骤二:图片像素格式由RGB转YUV

    之前的文章中讲解过RGB转YUV,这里简单说明一下为什么要转成YUV格式。对于我们而言,压缩最重要的是将重要的信息和不重要的信息分开来,YUV格式的图像格式恰好能做到这一点。对于人眼来说,明暗的变化更容易感知,这里相关生物学的知识就不班门弄斧了,因为本人也不是专业的。这里,YUV格式的图片将亮度和色度进行了分离,这样可以方便我们分离开数据的重要程度,从而进行下一步骤的处理。这就是为什么要转成YUV格式。

    步骤三:离散余弦变换

    下面我们来介绍一下JPEG压缩的核心技术,离散余弦变换(DCT变换)。具体的故事背景感兴趣的自己百度。
    前面在步骤一中,我们对图像进行了分割,分成了一个个小块。每一小块中,像素的数值的变化是平滑的。假设这一小块的像素值在79-81之间变化,如果这里用cos函数去模拟这段变化的轨迹,由于块的大小特别小,所以这里cos函数的频率是特别大的,这些变化被称为高频信息
    人眼对于这些高频信息是不敏感的,对低频信息比较敏感。假如将8*8的图像块和你的电脑背景作为对比,这样像素值会出现不平滑的变化,变化很大,这时要用函数组合去拟合这段离散数值时, 就会出现低频信息
    因此, 再结合图像压缩的核心思想, 要用较少的不同数值来表示图像, 就需要找到一种变换, 将图像高频的信息和低频的信息区分开来, 并将人眼不敏感的信息映射到接近或等于0。
    当我们要处理的是一堆离散的数据时,并且这些数据是对称的话,那么傅里叶变化出来的函数只含有余弦项,这种变换称为离散余弦变换。举个例子,有一组一维数据[x0,x1,x2,…,xn-1],那么可以通过DCT变换得到n个变换级数Fi
    在这里插入图片描述

    这个变换是可逆的,原始数据Xi可以通过离散余弦变换变化的逆变换(IDCT)表达出来。
    在这里插入图片描述
    经过DCT变换,可以把一个数组分解成数个数组的和,如果我们数组视为一个一维矩阵,那么可以把结果看做是一系列矩阵的和
    在这里插入图片描述
    经过DCT,杂乱的数据会被转换成几个工整变化的数据。DCT转换后的数组中第一个是一个直线数据,因此又被称为“直流数据”,简称DC,后面的数据被称为“交流数据”,简称AC,这个称呼起源于信号分析中的术语
    在JPEG压缩过程中,经过颜色空间的转换,每一个8X8的图像块,在数据上表现为3个8X8的矩阵,紧接着我们对这三个矩阵做一个二维的DCT转换,二维的DCT转换公式为
    在这里插入图片描述
    下面我们做一个实际的测试,比如一个所有数值都一样的矩阵,经过DCT转换后,将所有级数组合成一个新的矩阵
    在这里插入图片描述
    可以看到,经过DCT转换,矩阵的“能量”被全部集中在左上角上的直流分量F(0,0)上,其他位置都变成了0。
    在实际的JPEG压缩过程中,由于图像本身的连贯性,一个8X8的图像中的数值一般不会出现大的跳跃,经过DCT转换会有类似的效果,左上角的直流分量保存了一个大的数值,其他分量都接近于0,我们以刚刚那张图片的左上角第一块图像的Y分量为例,经过变换的矩阵为
    在这里插入图片描述
    可以看到,数据经过DCT变化后,被明显分成了直流分量和交流分量两部分,为后面的进一步压缩起到了充分的铺垫作用,可以说是整个JPEG中最重要的一步,后面我们会介绍数据量化。

    步骤四:数据量化

    刚刚将数据进行了离散余弦变换,并从刚刚的讲述中可以得知,离散余弦变换是有逆过程的。所以上一个步骤是无损的, 真正有损的步骤是在这一步的数据量化。
    经过刚刚的格式转换和离散余弦变换后,每一个小图块都变成了3个8*8的浮点矩阵,为什么是3个,因为每个像素点由Y,U,V三个分量组成。它的数据如下
    在这里插入图片描述
    接下来,我要在可以损失一部分精度的情况下,用更小的空间来存储这些数。这个时候我们用到了数据量化。何为量化,就像我们在看小电影的时候,每次快进没有按帧快进,而是按照10s一次往前进。忽略了一些不太必要的细节,从而达到要求,这里就叫量化。JPEG提供的量化算法如下:
    在这里插入图片描述
    其中G是我们需要处理的图像矩阵,Q称作量化系数矩阵,JPEG算法提供了两张标准的量化系数矩阵,分别用于处理亮度数据Y和色度数据U以及V。

    在这里插入图片描述
    亮度量化表
    在这里插入图片描述
    色度量化表

    其中round函数是取整函数,但考虑到了四舍五入,也就是说
    在这里插入图片描述
    比如上面数据,以左上角的-415.38为例,对应的量子化系数是16,那么round(-415.38/16)=round(-25.96125)=-26。最终得到的量子化后的结果为
    在这里插入图片描述
    可以看到,一大部分数据变成了0,这非常有利于后面的压缩存储。这两张神奇的量化表也是有讲究的,有损压缩就是把数据中重要的数据和不重要的数据分开,然后分别处理。DCT系数矩阵中的不同位置的值代表了图像数据中不同频率的分量,这两张表中的数据时人们根据人眼对不不同频率的敏感程度的差别所积累下的经验制定的,一般来说人眼对于低频的分量必高频分量更加敏感,所以两张量化系数矩阵左上角的数值明显小于右下角区域。在实际的压缩过程中,还可以根据需要在这些系数的基础上再乘以一个系数,以使更多或更少的数据变成0,我们平时使用的图像处理软件在生成jpg文件时,在控制压缩质量的时候,就是控制的这个系数。
    在进入下一节之前,矩阵的量化还有最后一步要做,就是把量化后的二维矩阵转变成一个一维数组,以方便后面的霍夫曼压缩,但在做这个顺序转换时,需要按照一个特定的取值顺序。
    在这里插入图片描述
    这么做的目的只有一个,就是尽可能把0放在一起,由于0大部分集中在右下角,所以才去这种由左上角到右下角的顺序,经过这种顺序变换,最终矩阵变成一个整数数组

    -26,-3,0,-3,-2,-6,2,-4,1,-3,0,1,5,1,2,-1,1,-1,2,0,0,0,0,0,-1,-1,0,0,0,0,…,0,0

    步骤五:编码

    JPEG最后一步是对变换,量化后的图像进行编码. 用huffman编码或者其他编码方式, 可以显著节省存储空间。

    展开全文
  • 、Android Skia 图像引擎 在上文中,提到的Skia是Android 的重要组成部分...Skia 在 Android 中提供了基本的画图简单的编解码功能,可以挂接其他的第三方编码解码库或者硬件编解码库,例如 libpng libjpeg,libgi

    本篇文章已授权微信公众号guolin_blog(郭霖)独家发布
    稀土掘金链接

    前言

         在前面的 Android图片压缩必备基础知识 中,提到的Skia是Android的重要组成部分。在鲁班压缩算法解析中提到哈夫曼压缩,那么他们之间到底是什么关系呢?

    系列教程

    可能是最详细的Android图片压缩原理分析(一)—— Android图片压缩必备基础知识
    可能是最详细的Android图片压缩原理分析(二)—— 鲁班压缩算法解析
    可能是最详细的Android图片压缩原理分析(三)—— 底层哈夫曼压缩讲解
    可能是最详细的Android图片压缩原理分析(四)—— 大图加载优化(防止OOM)

    一、Android Skia 图像引擎

    Android Skia 图像引擎

         Skia 是一个2D向量图形处理函数库, 2005年被Google收购后并自己维护的 c++ 实现的图像引擎,实现了各种图像处理功能,并且广泛地应用于谷歌自己和其它公司的产品中(如:Chrome、Firefox、 Android等),基于它可以很方便为操作系统、浏览器等开发图像处理功能。

         Skia 在 Android 中提供了基本的画图和简单的编解码功能,可以挂接其他的第三方编码解码库或者硬件编解码库,例如 libpng 和 libjpeg ,libgif 等等。因此,这个函数调用bitmap.compress(Bitmap.CompressFormat.JPEG...),实际会调用 libjpeg.so动态库进行编码压缩。

         最终 Android 编码保存图片的逻辑是 Java 层函数→Native 函数→Skia函数→对应第三库函数(例如 libjpeg)。所以skia就像一个 胶水层,用来链接各种第三方编解码库,不过 Android 也会对这些库做一些修改,比如修改内存管理的方式等等。

         Android 在之前从某种程度来说使用的算是 libjpeg 的功能阉割版,压缩图片默认使用的是 standard huffman,而不是 optimized huffman,也就是说使用的是默认的哈夫曼表,并没有根据实际图片去计算相对应的哈夫曼表,Google 在初期考虑到手机的性能瓶颈,计算图片权重这个阶段非常占用 CPU 资源的同时也非常耗时,因为此时需要计算图片所有像素 argb 的权重,这也是 Android 的图片压缩率对比 iOS 来说差了一些的原因之一。

    二、图像压缩与Huffman算法

         这里简单介绍一下哈夫曼算法哈夫曼算法是在多媒体处理里常用的算法之一。比如一个文件中可能会出现五个值 a,b,c,d,e,它们用二进制表达是:

    a. 1010 b. 1011 c. 1100 d. 1101 e. 1110

         我们可以看到,最前面的一位数字是 1,其实是浪费掉了,在定长算法下最优的表达式为:

    a. 010 b. 011 c. 100 d. 101 e. 110

         这样我们就能做到节省一位的损耗,那哈夫曼算法比起定长算法改进的地方在哪里呢?在哈夫曼算法中我们可以给信息赋予权重,即为信息加权重,假设 a 占据了 60%,b 占据了 20%, c 占据了 20%,d,e 都是 0%

    a:010 (60%) b:011 (20%) c:100 (20%) d:101 (0%) e:110 (0%)

         在这种情况下,我们可以使用哈夫曼树算法再次优化为:

    a:1 b:01 c:00

         所以思路当然就是出现频率高的字母使用短码,对出现频率低的使用长码,不出现的直接就去掉,最后 abcde 的哈夫曼编码就对应:1 01 00

         定长编码下的abcde010 011 100 101 110, 使用 哈夫曼树 加权重后的 编码则为 1 01 00,这就是哈夫曼算法的整体思路(关于算法的详细介绍可以参考哈夫曼树及编码讲解及例题)。

         所以这个算法一个很重要的思路是必须知道每一个元素出现的权重,如果我们能够知道每一个元素的权重,那么就能够根据权重动态生成一个最优的哈夫曼表。

         但是怎么去获取每一个元素,对于图片就是每一个像素中 argb 的权重呢,只能去循环整个图片的像素信息,这无疑是非常消耗性能的,所以早期 android 就使用了默认的哈夫曼表进行图片压缩。

    三、libjpeg 与 optimize_coding

         libjpeg在压缩图像时,有一个参数叫 optimize_coding,关于这个参数,libjpeg.doc有如下解释:

    TRUE causes the compressor to compute optimal Huffman coding tables
    for the image. This requires an extra pass over the data and
    therefore costs a good deal of space and time. The default is
    FALSE, which tells the compressor to use the supplied or default
    Huffman tables. In most cases optimal tables save only a few percent
    of file size compared to the default tables. Note that when this is
    TRUE, you need not supply Huffman tables at all, and any you do
    supply will be overwritten.

         由上可知,如果设置 optimize_codingTRUE,将会使得压缩图像过程中,会先基于图像数据计算哈弗曼表。由于这个计算会显著消耗空间和时间,默认值被设置为FALSE

         那么optimize_coding 参数的影响究竟会有多大呢?Skia 的官方人员经过实际测试,分别设置 optimize_coding=TRUEFALSE 进行压缩,发现 FALSE时的图片大小大约是 TRUE时的 2倍+。换言之就是相同文件体积的图片,不使用哈夫曼编码图片质量会比使用哈夫曼低 2倍+

         从 Android 7.0 版本开始,optimize_code 标示已经设置为了 TRUE,也就是默认使用图像生成哈夫曼表,而不是使用默认哈夫曼表。

         以上内容借鉴了Android 中图片压缩分析(上)中的内容,自认为不能比他写的更好,感谢QQ音乐技术团队,如有冒犯,请立即联系删除。

    四、手写JPEG图像处理引擎

         我们都知道bitmap是在native层被创建的,在Bitmap.cpp文件中,创建的bitmap其实是创建了一个SKBitmap的对象,交给了skia引擎去处理。
         导入jpeglib.h的头文件会需要其他的.h头文件,具体如下:
    在这里插入图片描述
         然后开始撸代码,照着安卓源码中libjpeg-turbo库里的example.c文件(系统提供的例子),开始编写native-lib.cpp文件:

    #include <jni.h>
    #include <string>
    #include <android/bitmap.h>
    #include <android/log.h>
    #include <malloc.h>
    // 因为头文件都是c文件,咱们写的是.cpp 是C++文件,这时候就需要混编,所以加入下面关键字
    extern "C"
    {
    #include "jpeglib.h"
    }
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
    #define LOG_TAG "louis"
    #define true 1
    typedef uint8_t BYTE;
    // 写入图片函数
    void writeImg(BYTE *data, const char *path, int w, int h) {
    
    //  信使: java与C沟通的桥梁,jpeg的结构体,保存的比如宽、高、位深、图片格式等信息
        struct jpeg_compress_struct jpeg_struct;
    //  设置错误处理信息 当读完整个文件的时候就会回调my_error_exit,例如内置卡出错、没权限等
        jpeg_error_mgr err;
        jpeg_struct.err = jpeg_std_error(&err);
    //  给结构体分配内存
        jpeg_create_compress(&jpeg_struct);
    //  打开输出文件
        FILE *file = fopen(path, "wb");
    //  设置输出路径
        jpeg_stdio_dest(&jpeg_struct, file);
    
        jpeg_struct.image_width = w;
        jpeg_struct.image_height = h;
    //  初始化  初始化
    //  改成FALSE   ---》 开启hufuman算法
        jpeg_struct.arith_code = FALSE;
    //  是否采用哈弗曼表数据计算 品质相差2倍多,官方实测, 吹5-10倍的都是扯淡
        jpeg_struct.optimize_coding = TRUE;
    //  设置结构体的颜色空间为RGB
        jpeg_struct.in_color_space = JCS_RGB;
    //  颜色通道数量
        jpeg_struct.input_components = 3;
    //  其他的设置默认
        jpeg_set_defaults(&jpeg_struct);
    //  设置质量
        jpeg_set_quality(&jpeg_struct, 60, true);
    //  开始压缩,(是否写入全部像素)
        jpeg_start_compress(&jpeg_struct, TRUE);
        JSAMPROW row_pointer[1];
    //    一行的rgb
        int row_stride = w * 3;
    //  一行一行遍历 如果当前的行数小于图片的高度,就进入循环
        while (jpeg_struct.next_scanline < h) {
    //      得到一行的首地址
            row_pointer[0] = &data[jpeg_struct.next_scanline * w * 3];
    //		此方法会将jcs.next_scanline加1
            jpeg_write_scanlines(&jpeg_struct, row_pointer, 1);//row_pointer就是一行的首地址,1:写入的行数
        }
        jpeg_finish_compress(&jpeg_struct);
        jpeg_destroy_compress(&jpeg_struct);
        fclose(file);
    }
    
    extern "C"
    JNIEXPORT void JNICALL
        Java_com_maniu_wechatimagesend_MainActivity_compress(JNIEnv *env, 
    												    	 jobject instance,
    												    	 jobject bitmap, 
    												    	 jstring path_) {
    
        const char *path = env->GetStringUTFChars(path_, 0);
    //  获取Bitmap信息
        AndroidBitmapInfo bitmapInfo;
        AndroidBitmap_getInfo(env, bitmap, &bitmapInfo);
    //  存储ARGB所有像素点
        BYTE *pixels;
    //  1、读取Bitmap所有像素信息
        AndroidBitmap_lockPixels(env, bitmap, (void **) &pixels);
    //  获取bitmap的 宽,高,format
        int h = bitmapInfo.height;
        int w = bitmapInfo.width;
    //  存储RGB所有像素点
        BYTE *data,*tmpData;
    //  2、解析每个像素,去除A通量,取出RGB通量,
    //  假如图片的像素是1920*1080,只有RGB三个颜色通道的话,计算公式为 w*h*3
        data= (BYTE *) malloc(w * h * 3);
    //  存储RGB首地址
        tmpData = data;
        BYTE r, g, b;
        int color;
        for (int i = 0; i < h; ++i) {
            for (int j = 0; j < w; ++j) {
                color = *((int *) pixels);
                // 取出R G B 
                r = ((color & 0x00FF0000) >> 16);
                g = ((color & 0x0000FF00) >> 8);
                b = ((color & 0x000000FF));
                // 赋值
                *data = b;
                *(data + 1) = g;
                *(data + 2) = r;
                // 指针后移
                data += 3;
                pixels += 4;
            }
        }
    //  3、读取像素点完毕 解锁,
        AndroidBitmap_unlockPixels(env, bitmap);
    //  直接用data写数据
        writeImg(tmpData, path, w, h);
        env->ReleaseStringUTFChars(path_, path);
    }
    

    整个讲解已经在代码里已经做了注释

    五、总结

    查阅源码发现:

         在Android系统在7.0版本之前内部使用的是libjpegturbo版,并且为了性能关闭了Huffman编码计算,使用默认的哈夫曼表,而不是算数编码。

         从 Android 7.0 版本开始,系统内部使用了libjpeg-turbo库并且启用Huffman编码,标示就是optimize_code 已经设置为了 TRUE,也就是默认使用Huffman压缩计算生成新的哈夫曼表。libjpeg-turbo是一个C语音编写的高效JPEG图像处理库,相当于是一个 libjpeg 的增强版。

         这也就是Luban压缩为什么会给出一个turbo分支,其实是为了兼容 Android 7.0 版本之前。那么前面也说了,Luban压缩可能会造成OOM,而且尤其是加载大图的时候,那么怎么去优化呢?让我们一起来看大图加载优化

    展开全文
  • 多媒体数据压缩技术

    2012-09-26 23:53:33
    主要内容简介: 数据压缩基本原理 数据压缩算法 静态图象JPEG压缩编码技术 动态图象MPEG压缩编码技术
  • 图像数据压缩方法

    千次阅读 2021-03-03 21:40:32
    数据能够进行压缩,是因为数据中存在或多或少的冗余信息,而对于视频音频等多媒体信息,更可以利用人类自身的感知冗余(失真)特点来实现更高的压缩比例。衡量压缩算法的三个主要性能指标如下: 压缩压缩质量...

    数据压缩方法

    数据能够进行压缩,是因为数据中存在或多或少的冗余信息,而对于视频和音频等多媒体信息,更可以利用人类自身的感知冗余(失真)特点来实现更高的压缩比例。衡量压缩算法的三个主要性能指标如下:

    压缩比
    压缩质量(失真)
    压缩与解压缩效率

    注:事实上人类视觉系统一般分辨能力约为64灰度等级,而一般图像量化采用256灰度等级,这类冗余我们称为视觉冗余。
    例如,人的视觉对于边缘的急剧变化不敏感,且人眼对图像的亮度信息敏感,对颜色的分辨率弱等,因此视频编码算法需要充分利用人眼的“弱点”进行 “欺骗性”设计.

    数据压缩方法分类:

    1、根据编码后数据与原始数据是否一致:

    1、1 可逆编码(无失真编码,无损压缩)

    例如:Huffman编码、算术编码、行程长度编码等。

    1、2 不可逆编码(有失真编码,有损压缩)

    例如:变换编码和预测编码

    图像压缩编码方法分类:
    在这里插入图片描述

    2、根据压缩原理:

    2、1 信息熵编码(统计编码)

    信息熵编码又称统计编码,它是根据信源符号出现概率的分布特性而进行的压缩编码,基本思想是在信源符号和码字之间建立明确的一一对应关系,以便在恢复时能准确地再现原信号,同事要使平均码长或码率尽量小。最常见的是Huffman编码、Shannon(香农)编码以及算术编码。

    Huffman编码
    Huffman编码属于信息熵编码的方法之一,霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短:而对于出现频率低的信息,编码长度较长。如此,处理全部信息的总码长一定小于实际信息的码长。

    算术编码
    算术编码把一个信源集合表示为实数线上的0到1之间的一个区间,这个集合的每一个元素都用来缩短这个区间。
    信源集合的元素越多,所得到的区间就越小,当区间变小时,就需要更多的数位来表示这个区间,这就是区间作为代码的原理。算数编码首先假设一个信源的概率模型,然后利用这些概率来缩小表示信源集的区间。

    行程编码
    行程编码又称为运行长度编码或游程编码,是一种统计编码,常用RLE(Run-LengthEncoding)表示。
    这是无损编码,一般包含两项,第一项时用一个符号串代替具有相同值得连续符号,第二项是记录原始数据中有多少个这样的值。
    例如66777770002555558888的行程编码为(6,2)(7,5)(0,3)(2,1)(5,5)(8,4).

    预测编码
    预测编码的原理是利用相邻样本的相关性来预测数据,预测编码可以用于空域(比如同一帧中相邻像素样本之间具有高度相关性),也可以用于时域(比如相邻两帧图像的相同位置的像素样本之间具有高度相关性)。

    这样,预测编码无需编码传输所有的采样值,而是编码传输采样值的预测值与其实际值之间的差值。预测编码分为线性预测及非线性预测,线性预测的典型代表是差分脉冲编码调制( DPCM) 编码。

    空间冗余是图像数据中经常存在的一种冗余,在同一幅图像中,规则物体和规则背景的表面物理特性具有相关性,这些相关性的光成像结构在数字化图像中就表现为数据冗余。时间冗余则是序列图像中所经常包含的冗余,序列图像中的两幅相邻的图像之间有较大的相关性,即反映为时间冗余。空间冗余及时间冗余示意如下图所示。
    在这里插入图片描述
    变换编码

    预测编码方式消除相关性的能力有限,变换编码是一种更高效的编码方式。变换编码的思想是将原始数据从时间域或者空间域变换到另一个更适合于压缩的抽象域,通常为频域。

    即变换编码不是对空间区域的图像信号编码,而是将图像信号映射变换到另外一个正交矢量空间(变换域或频域),产生一系列变换系数,然后对这些系数进行编码处理。

    变换具有可逆性及可实现性,目前普遍采用的是基于块的离散余弦变换(DCT)。

    变换编码的主要分类如下:
    离散余弦变换(DCT)
    离散正弦变换(DST)
    离散小波变换(DWT)
    离散傅立叶变换(DFT)

    模型编码
    模型编码是利用计算机视觉技术和图形学技术对图像信号进行分析和合成,通过对图像的分析和描述,将图像视为实际的三维空间场景的二维平面的投影,进而对图像结构和特征进行分析并提取出特征参数,然后用某种模型进行描述,最后通过对模型参数编码达到视频压缩的目的。

    在解码时,根据参数和模型的“先验”知识重建图像。由于是对“特征参数”进行的编码,因此压缩比较高。模型编码目前主要集中应用于可视电话和会议电视系统中。

    因为此类应用传送的图像中主要感兴趣的内容是人的“头肩像”,是一种基本固定的特定场景,可以预先建立人体头肩像的三维模型,从而进行模型编码。

    混合编码
    用两种或两种以上的方法对图像进行编码称为混合编码,混合编码是近年来广泛采用的一种视频编码压缩方法。
    混合编码通常使用DCT等变换方式进行空间冗余度的压缩,用帧间预测或运动补偿预测进行时间冗余度的压缩,从而达到对运动图像的更高的压缩率。
    视频压缩过程中主要利用的冗余信息如下表所示。
    在这里插入图片描述

    展开全文
  • 多媒体计算机技术原理及应用十.ppt第三章 MPC组成 多媒体计算机技术原理及应用 主讲教师:李 晓 第三章 学习内容——本节课学习内容 3.1 多媒体存储技术 3.2 多媒体功能卡 3.3 多媒体信息获取与显示设备 3.4 多媒体...
  • 一、实验目的(所实现功能、验证性目的、创新性目的) 在理解并掌握行程编码的基础上,采用高级语言实现行程编码的解压缩算法,由此使学生理解多媒体数据压缩原理
  • JPEG压缩原理

    千次阅读 2013-05-09 10:19:59
    老师让看看JPEGMPEG的压缩原理,让从中提炼一些思想用于DIC。现在还是没有多少头绪。。到网上找了一下JPEG的压缩原理,感觉下面这篇还不错,就转过来了。 http://vipbase.net/ipbook/chap09.htm 在介绍图象...
  • DPCM 压缩系统的实现分析,掌握DPCM编解码系统的基本原理。初步掌握实验用C语言编程实现DPCM编码器并分析其压缩效率。
  • 基于DCT变换的JPEG图像压缩原理

    千次阅读 2018-06-07 21:36:51
    1、为什么要进行图像压缩 众所周知,当今人类社会具有三大支柱,即物质、能量、信息。当下已由物质过渡到信息,从农业现代化到工业现代化,再到当今的信息化时代。信息具有通用性、抽象性、无限性。其通用性表现在...
  • Huffman编码,1,多媒体计算机技术原理及应用,主讲:李晓,辅导课程六,Huffman编码,2,第二章学习内容,2.1信息表示与编码2.2常用的数据压缩技术2.3静态图像压缩标准JPEG2.4运动图像压缩标准MPEG2.5视听通信编码解码标准H...
  • 摄像头视频采集压缩及传输原理

    千次阅读 2019-09-14 02:15:22
    摄像头基本的功能还是视频传输,那么它是依靠怎样的原理来实现的呢?所谓视频传输: 就是将图片一张张传到屏幕,由于传输速度很快,所以可以让大家看到连续动态的画面,就像放电影一样。一般当画面的传输数量达到每秒...
  • 多媒体技术简答题论述题

    千次阅读 2020-08-06 10:08:14
    1、 MMX技术的特点 (1)打包的数据类型 (2)与 IA 结构完全兼容 (3)64 位的 MMX寄存储器组 (4)增强的指令系统 ...(1) 压缩前后所需的信息存储量之比要大; (2) 实现压缩的算法要简单,压缩、解压缩
  • 1、信息安全 根据考试大纲,本章要求考生掌握以下几个方面的知识点。...在软件设计师的考试中,经常会考到与安全相关的一些基础概念及技术原理,如:区分对称与非对称算法 ,什么情况下用哪种密钥加密解密
  • 关于JPEG压缩编码 JPEG是联合图像专家组...本文对J JPEG图像压缩编码方法进行了基本介绍,其中重点介绍了哈夫曼编码行程编码的基本原理和在JPEG压缩编码算法中的具体应用。 关键词:行程编码,JPEG,,哈夫曼编码
  • (2)传递信息的基本元素,如文字、声音、图形、动画图像 3.常见的媒体形式 (1)文本 (2)图形:多媒体中的静态可视元素之一,一般是以采用算法语言或某些应用软件生成的矢量图的形式来表达 (3)图像:多媒体中...
  • 在计算机系统中,多媒体指组合两种或两种以上媒体的一种人机交互式信息交流传播媒体。使用的媒体包括文字、图片、照片、声音 、动画影片,以及程式所提供的互动功能。多媒体是超媒体(Hypermedia)系统中的一个...
  • 实验四图像压缩编码程序设计一、实验目的要求本实验为设计性实验,其目的是理解有损压缩的概念,特别是通过K-L变换或DCT变换,掌握压缩编码的基本原理、算法,并通过编程给予实现,对原始图像数据解压后的图像...
  • 有损压缩算法

    千次阅读 2019-01-17 17:05:10
    由于信息丢失意味着在误差比特率之间进行一些权衡,我们首先考虑失真度量---例如,平方误差。本文引入了不同的量化器,...对于需要更高压缩比的多媒体应用中的图像压缩,通常采用有损方法。在有损压缩中,压缩图像...
  • 无损压缩经典算法

    万次阅读 多人点赞 2016-10-25 22:54:04
    @前言总结经典的文件压缩算法原理,主要包括:哈夫曼压缩算法及其延伸,LZ77算法及其演变算法,LZ78算法及其演变算法,几何编码算法Arithmetic Coding。内容部分摘录翻译自港大‘多媒体技术’硕士课程1.进行文件压缩...
  • 多媒体信息技术》复习思考题

    万次阅读 2017-07-06 09:17:48
    多媒体是融合两种或者两种以上媒体的一种人-机交互式的信息交流传播媒体。 对信息技术而言,多媒体是用多种媒体综合表达信息内容。对计算机而言,多媒体是将图、文、声、像等内容混成在一起的一门计算机技术。...
  • 图像数据压缩原理

    千次阅读 2012-12-11 09:19:26
    图像数据压缩原理 ...信息论的创始人Shannon提出把数据看作是信息和冗余度(redundancy)的组合。所谓冗余度,是由于一副图像的各像素之间存在着很大的相关性,可利用一些编码的方法删去它们,从
  • 图像压缩综述.docx

    2020-05-09 11:10:18
    多媒体技术网络与移动通信的飞速发展激发了人们进行视频信息交流的需求,推动了图像通信数字视频技术的全面发展。图像视频信号数字化可以避免远距离传输的累积失真,数字化存储可以高保真还原,并且容易借助...
  • 有了单个的计算机组成,这篇博客还加入了多媒体和网络的知识,这样更类似我们现实生活给计算机搭配上各种装扮(多媒体相互之间的桥梁(网络)。当然系统网络的安全可靠性也是大家担忧的,需要我们好好学习! ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,391
精华内容 5,756
关键字:

多媒体信息压缩的原理和方法