标题 | 基于JPEG算法的Android图像压缩技术研究 |
范文 | 徐唐+王锦+杨丹 摘要:在现代的移动应用中,图片会消耗大量数据流量。对图片进行压缩是解决该问题的有效途径之一。Android API提供了Bitmap类来对图片进行压缩处理操作,但其性能并非最优,本文将JPEG算法应用到Android程序开发领域进行图片压缩,并引入PSNR值进行评估。实验表明,在将图片保存相同质量和图片PSNR值相近的情况下,JPEG算法能更加快速高效地压缩图片。 关键词:JPEG算法;Android;图像压缩;DCT;PSNR 中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)22-0176-03 Abstract: In modern mobile applications, the picture will consume a lot of data traffic. Image compression is one of the effective ways to solve the problem. Android API provides the Bitmap class to perform image compression processing operation, but its performance is not optimal, this article will JPEG algorithm is applied to Android application development field image compression, and the introduction of PSNR value assessment. Experiments show that the same picture quality and save image PSNR value similar circumstances, JPEG algorithm can more quickly and efficiently compress image. Key words: JPEG algorithm; Android; image compression; DCT; PSNR 自从2008年9月,Google公司正式发布了Android 1.0操作系统以来,Android凭借其开放性、开发便捷以及丰富的硬件支持,受到广大移动应用开发人员的青睐,使其在移动开发市场份额迅速跃居全球第一[1]。据有关市场研究机构统计,截止2016年4月底,Android操作系统在全球所占份额已达到76%。 基于Android系统的移动设备,有智能手机,平板电脑等,在人们的日常生活中越来越普及。以前由于手机像素不高,拍照相片质量较小,所占的手机内存和上传网络所用的数据流量很少,但随着设备硬件的提升和人们对手机拍照要求的提高,手机摄像头的像素也不断提高,如一般机型三星GALAXY J7摄像头像素达到1300万,拍摄照片能达到10M以上,占据大量的数据存储空间。如果将手机中的照片直接通过网络上传至远程的服务器中,如此大的图片信息会导致上传速度缓慢、消耗大量数据流量等问题。解决该问题可以依靠提高设备硬件水平、加大信道带宽、压缩大数据图片等方法。 图像的压缩算法有JPEG算法,JPEG2000算法,基于小波变换的图像压缩等。在Android程序开发中,目前最常用的方法是Android API提供的Bitmap类图像压缩,该方法的压缩效率不是很高。本文对静态图像数据压缩JPEG算法进行研究,并将该算法应用到Android应用程序的图片压缩中。 1 Android系统Bitmap类压缩 Android API提供的Bitmap类是处理图像的主要类之一,不仅获取图像信息,还可以图像进行裁剪、旋转、放大缩小等操作,对图像指定保存格式。Bitmap类实现在android.graphics包中。Bitmap是一个私有的构造函数,不能 对外实例化,只能通过JIN实例化,由BitmapFactory类实现对JNI接口来实例化。 Bitmap类对图像进行压缩的方法是compress(Bitmap.CompressFormat format, int quality, OutputStream stream),其中format是图像的压缩格式(JPRG和PNG),quality是图像保存质量,值为1-100范围的整数,100为高质量保存,1为低质量保存,stream是写入压缩数据的输入流。 2 JPEG压缩算法 JPEG算法是由IEO和ISO两个组织机构制定的静态数字图像数据压缩编码标准,是国际上通用的标准。因此又被称为JPEG标准[2]。该算法对灰度图像和彩色图像都能够提供良好的压缩性能,还具有很好的重建质量,因此广泛应用于视频和图像处理领域。目前网站上80% 的图像都是采用的JPEG压缩算法。jpeg是一种非常灵活的格式,具有调节图像质量的功能。可以用不同的压缩比例对图像进行压缩,压缩比越小,品质就越高,相反地,品质就越低[3]。 JPEG算法有4种工作模式,分别是顺序编码,分层编码,渐进编码和无失真编码其中基于顺序编码工作模式的压缩系统被称为基本系统。本文所用的顺序编码模式采用对图像从左到右、从上到下扫描,将一帧图像分为bit 数据块,然后通过DCT变换、量化和编码来调整图像压缩比和质量。JPEG算法压缩的主要骤(图1): 1)颜色模式转换及采样 JPEG采用的颜色空间是YCrCb,而要处理的图片是RGB颜色空间,所以在压缩之前,首先要进行颜色空间转换。在YCrCb颜色空间中,Y代表亮度,Cr代表色度,Cb代表饱和度,三者一般用Y,U,V表示。如下是RGB和YCrCb的转换公式[4]: 研究表明,人的眼睛一般对亮度比较敏感,对色度和饱和度敏感度低,因此,在采样时亮度Y的分量要多一些。通常采样的比例是Y:U:V = 4:1:1或Y:U:V = 4:2:2,即Y每个像素都采样,而U和V每四个像素采样一次或每四个采样两次。这样就达到了本来要用12个字节存储的内容,现在只需要用6个或8个字节存储,虽然损失了一定的精度,但人眼却察觉不到。 2)离散余弦变换(DCT变换) 离散余弦变换简称DCT变换,是码率压缩中常用的变换编码方法。DCT变换先将图像分成8 × 8的像素块,然后对每个像素块进行DCT操作。下面是JPEG编码过程中的正向离散余弦变换公式和解码过程中的反向离散余弦变换公式[5]: 3)量化 图像经过DCT变换以后,还需要进行量化,才能进入编码过程[6]。量化的过程是由两个的量化矩阵数据,一个是处理亮度的频率系数和针对色度的平率系数分别除以量化矩阵后的值取整数,量化矩阵分别是JPEG亮度量化表(表1)和JPEG色度量化表(表2)。由于量化过程中将浮点数取为了整数,造成了一定的数据精度不同。这也是有损压缩过程中导致解码无法恢复原图质量的主要原因[7]。量化公式为: 其中为量化表对应值 4)编码 编码过程分别有直流系数(DC)编码,交流系数(AC)编码和熵编码。DC编码由于DC直流系数值较大和相邻图像块的DC系数值具有一定相关性这两个特点,因此采用了差分脉冲调制编码(DPCM)技术。对相邻图像块之间的量化DC系数的差值(De)进行编码[8],公式为:。 量化AC系数的特点是除DA系数剩下的63个AC系数中有许多个“0”系数,所以采用行程编码(RLC, Run Length Coding)来降低数据量。RLC编码方式是用两个字节来代替一个字符串,第一个字节表示重复的次数,第二个字节表示被重复的字符串。而在JPEG算法中其含义略有变化,当RLC编码过后得到(I,J)数据对,其中I表示两个非零AC系数之间连续的“0”的个数,J表示下一个非零AC系数值,当AC之间连续的“0”的个数超过16个,则扩展一个字节来表示。 JPEG熵编码主要有霍夫曼编码(Huffman)和算术编码,一般常用的是Huffman编码。Huffman编码是用简单的查表(Lookup Table)方法进行压缩。在压缩DC系数和AC系数的中间格式数据时,Huffman编码器将对出现频率较低的符号分配较长的代码,对出现频率较高的符号分配较短的代码[9]。由于AC系数和DC系数,亮度和色度都采用不同的Huffman编码表,因此完成熵编码工作共需要4张Huffman编码表。 最后将各种标记代码和编码后的图像数据组成JPEG位图数据流(JPEG bitstream),以方便传输、存储和译码器进行译码。 3 实验过程及结果 实验开始之前,首先在网上下载C语言编写的libjpeg库,该库中包含广泛使用的JPEG编解码和其他JPEG功能的实现。使用libjpeg库需要用到JIN技术[10]来自己调用C语言程序库,不需要重写Java库文件,从而减少了大量程序开发的工作量。实验目的是分别用Bitmap类和libjpeg库的方法压缩图片,设置保存图片质量分别在90,70,50,20,10的时候,判断压缩后两张图片的PSNR值相近的情况下,比较压缩消耗的时间和压缩倍数,得出哪种方法综合性能更好。 峰值信噪比(PSNR值)是表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值。用于检测图像重建质量的重要参数,数值越小,表示图像失真度越大,反之表示失真度越小[11] 。PSNR值可以通过Matlab计算得出,代码如下: function PSNR = psnr(f1, f2) %计算图f1,f2峰值信噪比 k = 8; fm = 2.^k - 1; a = fm.^2; e = im2uint8(f1) - im2uint8(f2); [m, n] = size(e); b = mean(sum(sum(e.^2))); PSNR = 10*log10(m*n*a/b); 实验所用的开发平台是Eclipse 4.4,操作系统版本是Android 5.1.1,程序运行在三星Galaxy J7智能手机,原始大小为1775KB的jpeg格式图像。下面是部分实验效果图(图2),程序运行部分结果(图3),表格为实验数据(表3): 从表3中我们可以看出,在对图片保存相同质量的情况下,图片PSNR值相近,但是JPEG算法所用的压缩时间要少一倍,且压缩倍数大大提高。说明JPEG算法的压缩性能优于Android系统提供的压缩方法。 Quality:保存质量;Method:使用方法;Time:压缩图片耗时; Size:压缩后图片大小;PSNR:峰值信噪比;Multiple:压缩倍数。 4 结束语 本文对JPEG图片压缩算法应用到Android平台下进行了研究。JPEG算法被广泛应用于图片压缩领域,本文将该算法应用到Android程序应用开发当中,对仍然达到了很好的压缩效果。虽然Android API提供了有效的图片压缩类Bitmap,经过上述实验表明,当以相同质量保存图片时,JPEG压缩算法在压缩消耗的时间和压缩倍数上要更胜一筹。 参考文献: [1] 邹绍武, 苏贵斌. Android应用开发中图片压缩技术的研究应用[J]. 计算机技术与发展, 2015(6): 106-109. [2] Acharya T, Tsai P S. JPEG2000 Standard for Image Compression: Concepts, Algorithms and VLSI Architectures[M]. 2005. [3] 万荣泽, 莫洪武, 余思东. 基于量化表的图像篡改检测算法[J]. 电子技术应用, 2014, 10: 124-126,130. [4] 钱鹏鹤. 基于JPEG压缩技术在移动终端上手写信息的设计和实现[D]. 上海: 上海交通大学, 2007. [5] 武瑛. DCT变换在图像压缩中的应用[J]. 计算机与现代化, 2013(4): 103-106. [6] 张首君, 陈银杰, 安孝宽, 等. 数字视频信号的压缩编码原理[J]. 西北大学学报:自然科学版, 2007(3): 379-383. [7] Acharya T, Ray A K. Image Processing: Principles and Applications[J]. Journal of Electronic Imaging, 2006, 15(3): 579-84. [8] 魏以民, 姚轶. 基于TMS320VC5509的JPEG编码实现与优化[C]//中国电子学会信号处理分会、中国仪器仪表学会信号处理分会.第十四届全国信号处理学术年会(CCSP-2009)论文集. 中国电子学会信号处理分会、中国仪器仪表学会信号处理分会, 2009: 3. [8] 吴熙, 李相朋, 梁晶, 等. 基于Libjpeg的JPEG编码的实现[J]. 电子制作, 2015(5): 111-112. [9] 蒋华, 孙婧. 基于JNI的电子签章系统安全接口设计[J]. 信息技术, 2016(3): 50-53. [10] 邹文辉. 基于Huffman编码的DSP图像无损压缩系统[J]. 西华师范大学学报:自然科学版, 2014(3): 292-295. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。