徐唐+王錦+楊丹
摘要:在現(xiàn)代的移動應用中,圖片會消耗大量數(shù)據(jù)流量。對圖片進行壓縮是解決該問題的有效途徑之一。Android API提供了Bitmap類來對圖片進行壓縮處理操作,但其性能并非最優(yōu),本文將JPEG算法應用到Android程序開發(fā)領(lǐng)域進行圖片壓縮,并引入PSNR值進行評估。實驗表明,在將圖片保存相同質(zhì)量和圖片PSNR值相近的情況下,JPEG算法能更加快速高效地壓縮圖片。
關(guān)鍵詞: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公司正式發(fā)布了Android 1.0操作系統(tǒng)以來,Android憑借其開放性、開發(fā)便捷以及豐富的硬件支持,受到廣大移動應用開發(fā)人員的青睞,使其在移動開發(fā)市場份額迅速躍居全球第一[1]。據(jù)有關(guān)市場研究機構(gòu)統(tǒng)計,截止2016年4月底,Android操作系統(tǒng)在全球所占份額已達到76%。
基于Android系統(tǒng)的移動設(shè)備,有智能手機,平板電腦等,在人們的日常生活中越來越普及。以前由于手機像素不高,拍照相片質(zhì)量較小,所占的手機內(nèi)存和上傳網(wǎng)絡(luò)所用的數(shù)據(jù)流量很少,但隨著設(shè)備硬件的提升和人們對手機拍照要求的提高,手機攝像頭的像素也不斷提高,如一般機型三星GALAXY J7攝像頭像素達到1300萬,拍攝照片能達到10M以上,占據(jù)大量的數(shù)據(jù)存儲空間。如果將手機中的照片直接通過網(wǎng)絡(luò)上傳至遠程的服務器中,如此大的圖片信息會導致上傳速度緩慢、消耗大量數(shù)據(jù)流量等問題。解決該問題可以依靠提高設(shè)備硬件水平、加大信道帶寬、壓縮大數(shù)據(jù)圖片等方法。
圖像的壓縮算法有JPEG算法,JPEG2000算法,基于小波變換的圖像壓縮等。在Android程序開發(fā)中,目前最常用的方法是Android API提供的Bitmap類圖像壓縮,該方法的壓縮效率不是很高。本文對靜態(tài)圖像數(shù)據(jù)壓縮JPEG算法進行研究,并將該算法應用到Android應用程序的圖片壓縮中。
1 Android系統(tǒng)Bitmap類壓縮
Android API提供的Bitmap類是處理圖像的主要類之一,不僅獲取圖像信息,還可以圖像進行裁剪、旋轉(zhuǎn)、放大縮小等操作,對圖像指定保存格式。Bitmap類實現(xiàn)在android.graphics包中。Bitmap是一個私有的構(gòu)造函數(shù),不能 對外實例化,只能通過JIN實例化,由BitmapFactory類實現(xiàn)對JNI接口來實例化。
Bitmap類對圖像進行壓縮的方法是compress(Bitmap.CompressFormat format, int quality, OutputStream stream),其中format是圖像的壓縮格式(JPRG和PNG),quality是圖像保存質(zhì)量,值為1-100范圍的整數(shù),100為高質(zhì)量保存,1為低質(zhì)量保存,stream是寫入壓縮數(shù)據(jù)的輸入流。
2 JPEG壓縮算法
JPEG算法是由IEO和ISO兩個組織機構(gòu)制定的靜態(tài)數(shù)字圖像數(shù)據(jù)壓縮編碼標準,是國際上通用的標準。因此又被稱為JPEG標準[2]。該算法對灰度圖像和彩色圖像都能夠提供良好的壓縮性能,還具有很好的重建質(zhì)量,因此廣泛應用于視頻和圖像處理領(lǐng)域。目前網(wǎng)站上80% 的圖像都是采用的JPEG壓縮算法。jpeg是一種非常靈活的格式,具有調(diào)節(jié)圖像質(zhì)量的功能??梢杂貌煌膲嚎s比例對圖像進行壓縮,壓縮比越小,品質(zhì)就越高,相反地,品質(zhì)就越低[3]。
JPEG算法有4種工作模式,分別是順序編碼,分層編碼,漸進編碼和無失真編碼其中基于順序編碼工作模式的壓縮系統(tǒng)被稱為基本系統(tǒng)。本文所用的順序編碼模式采用對圖像從左到右、從上到下掃描,將一幀圖像分為bit 數(shù)據(jù)塊,然后通過DCT變換、量化和編碼來調(diào)整圖像壓縮比和質(zhì)量。JPEG算法壓縮的主要驟(圖1):
1)顏色模式轉(zhuǎn)換及采樣
JPEG采用的顏色空間是YCrCb,而要處理的圖片是RGB顏色空間,所以在壓縮之前,首先要進行顏色空間轉(zhuǎn)換。在YCrCb顏色空間中,Y代表亮度,Cr代表色度,Cb代表飽和度,三者一般用Y,U,V表示。如下是RGB和YCrCb的轉(zhuǎn)換公式[4]:
研究表明,人的眼睛一般對亮度比較敏感,對色度和飽和度敏感度低,因此,在采樣時亮度Y的分量要多一些。通常采樣的比例是Y:U:V = 4:1:1或Y:U:V = 4:2:2,即Y每個像素都采樣,而U和V每四個像素采樣一次或每四個采樣兩次。這樣就達到了本來要用12個字節(jié)存儲的內(nèi)容,現(xiàn)在只需要用6個或8個字節(jié)存儲,雖然損失了一定的精度,但人眼卻察覺不到。
2)離散余弦變換(DCT變換)
離散余弦變換簡稱DCT變換,是碼率壓縮中常用的變換編碼方法。DCT變換先將圖像分成8 × 8的像素塊,然后對每個像素塊進行DCT操作。下面是JPEG編碼過程中的正向離散余弦變換公式和解碼過程中的反向離散余弦變換公式[5]:
3)量化
圖像經(jīng)過DCT變換以后,還需要進行量化,才能進入編碼過程[6]。量化的過程是由兩個的量化矩陣數(shù)據(jù),一個是處理亮度的頻率系數(shù)和針對色度的平率系數(shù)分別除以量化矩陣后的值取整數(shù),量化矩陣分別是JPEG亮度量化表(表1)和JPEG色度量化表(表2)。由于量化過程中將浮點數(shù)取為了整數(shù),造成了一定的數(shù)據(jù)精度不同。這也是有損壓縮過程中導致解碼無法恢復原圖質(zhì)量的主要原因[7]。量化公式為:
其中為量化表對應值
4)編碼
編碼過程分別有直流系數(shù)(DC)編碼,交流系數(shù)(AC)編碼和熵編碼。DC編碼由于DC直流系數(shù)值較大和相鄰圖像塊的DC系數(shù)值具有一定相關(guān)性這兩個特點,因此采用了差分脈沖調(diào)制編碼(DPCM)技術(shù)。對相鄰圖像塊之間的量化DC系數(shù)的差值(De)進行編碼[8],公式為:。
量化AC系數(shù)的特點是除DA系數(shù)剩下的63個AC系數(shù)中有許多個“0”系數(shù),所以采用行程編碼(RLC, Run Length Coding)來降低數(shù)據(jù)量。RLC編碼方式是用兩個字節(jié)來代替一個字符串,第一個字節(jié)表示重復的次數(shù),第二個字節(jié)表示被重復的字符串。而在JPEG算法中其含義略有變化,當RLC編碼過后得到(I,J)數(shù)據(jù)對,其中I表示兩個非零AC系數(shù)之間連續(xù)的“0”的個數(shù),J表示下一個非零AC系數(shù)值,當AC之間連續(xù)的“0”的個數(shù)超過16個,則擴展一個字節(jié)來表示。
JPEG熵編碼主要有霍夫曼編碼(Huffman)和算術(shù)編碼,一般常用的是Huffman編碼。Huffman編碼是用簡單的查表(Lookup Table)方法進行壓縮。在壓縮DC系數(shù)和AC系數(shù)的中間格式數(shù)據(jù)時,Huffman編碼器將對出現(xiàn)頻率較低的符號分配較長的代碼,對出現(xiàn)頻率較高的符號分配較短的代碼[9]。由于AC系數(shù)和DC系數(shù),亮度和色度都采用不同的Huffman編碼表,因此完成熵編碼工作共需要4張Huffman編碼表。
最后將各種標記代碼和編碼后的圖像數(shù)據(jù)組成JPEG位圖數(shù)據(jù)流(JPEG bitstream),以方便傳輸、存儲和譯碼器進行譯碼。
3 實驗過程及結(jié)果
實驗開始之前,首先在網(wǎng)上下載C語言編寫的libjpeg庫,該庫中包含廣泛使用的JPEG編解碼和其他JPEG功能的實現(xiàn)。使用libjpeg庫需要用到JIN技術(shù)[10]來自己調(diào)用C語言程序庫,不需要重寫Java庫文件,從而減少了大量程序開發(fā)的工作量。實驗目的是分別用Bitmap類和libjpeg庫的方法壓縮圖片,設(shè)置保存圖片質(zhì)量分別在90,70,50,20,10的時候,判斷壓縮后兩張圖片的PSNR值相近的情況下,比較壓縮消耗的時間和壓縮倍數(shù),得出哪種方法綜合性能更好。
峰值信噪比(PSNR值)是表示信號最大可能功率和影響它的表示精度的破壞性噪聲功率的比值。用于檢測圖像重建質(zhì)量的重要參數(shù),數(shù)值越小,表示圖像失真度越大,反之表示失真度越小[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);
實驗所用的開發(fā)平臺是Eclipse 4.4,操作系統(tǒng)版本是Android 5.1.1,程序運行在三星Galaxy J7智能手機,原始大小為1775KB的jpeg格式圖像。下面是部分實驗效果圖(圖2),程序運行部分結(jié)果(圖3),表格為實驗數(shù)據(jù)(表3):
從表3中我們可以看出,在對圖片保存相同質(zhì)量的情況下,圖片PSNR值相近,但是JPEG算法所用的壓縮時間要少一倍,且壓縮倍數(shù)大大提高。說明JPEG算法的壓縮性能優(yōu)于Android系統(tǒng)提供的壓縮方法。
Quality:保存質(zhì)量;Method:使用方法;Time:壓縮圖片耗時;
Size:壓縮后圖片大?。籔SNR:峰值信噪比;Multiple:壓縮倍數(shù)。
4 結(jié)束語
本文對JPEG圖片壓縮算法應用到Android平臺下進行了研究。JPEG算法被廣泛應用于圖片壓縮領(lǐng)域,本文將該算法應用到Android程序應用開發(fā)當中,對仍然達到了很好的壓縮效果。雖然Android API提供了有效的圖片壓縮類Bitmap,經(jīng)過上述實驗表明,當以相同質(zhì)量保存圖片時,JPEG壓縮算法在壓縮消耗的時間和壓縮倍數(shù)上要更勝一籌。
參考文獻:
[1] 鄒紹武, 蘇貴斌. Android應用開發(fā)中圖片壓縮技術(shù)的研究應用[J]. 計算機技術(shù)與發(fā)展, 2015(6): 106-109.
[2] Acharya T, Tsai P S. JPEG2000 Standard for Image Compression: Concepts, Algorithms and VLSI Architectures[M]. 2005.
[3] 萬榮澤, 莫洪武, 余思東. 基于量化表的圖像篡改檢測算法[J]. 電子技術(shù)應用, 2014, 10: 124-126,130.
[4] 錢鵬鶴. 基于JPEG壓縮技術(shù)在移動終端上手寫信息的設(shè)計和實現(xiàn)[D]. 上海: 上海交通大學, 2007.
[5] 武瑛. DCT變換在圖像壓縮中的應用[J]. 計算機與現(xiàn)代化, 2013(4): 103-106.
[6] 張首君, 陳銀杰, 安孝寬, 等. 數(shù)字視頻信號的壓縮編碼原理[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編碼實現(xiàn)與優(yōu)化[C]//中國電子學會信號處理分會、中國儀器儀表學會信號處理分會.第十四屆全國信號處理學術(shù)年會(CCSP-2009)論文集. 中國電子學會信號處理分會、中國儀器儀表學會信號處理分會, 2009: 3.
[8] 吳熙, 李相朋, 梁晶, 等. 基于Libjpeg的JPEG編碼的實現(xiàn)[J]. 電子制作, 2015(5): 111-112.
[9] 蔣華, 孫婧. 基于JNI的電子簽章系統(tǒng)安全接口設(shè)計[J]. 信息技術(shù), 2016(3): 50-53.
[10] 鄒文輝. 基于Huffman編碼的DSP圖像無損壓縮系統(tǒng)[J]. 西華師范大學學報:自然科學版, 2014(3): 292-295.