本文是想給大家分享一下,在向多媒體服務(wù)器上傳圖片再下載圖片我遇到的問(wèn)題贝搁,是很容易被大家忽視的問(wèn)題。
問(wèn)題描述
我們公司同事發(fā)現(xiàn)芽偏,在向多媒體服務(wù)器上傳圖片之后雷逆,再使用服務(wù)器API對(duì)上傳之后的圖片進(jìn)行尺寸剪裁,使用的圖片分辨率為15755 × 3426大小為3MB污尉,剪裁之后的圖片分辨率為8000× 1740大小為16MB膀哲,分辨率降低了圖片大小反而增大,這肯定不是我們想要的結(jié)果被碗,就這個(gè)問(wèn)題我展開(kāi)了調(diào)查某宪,到底是服務(wù)器的問(wèn)題還是客戶(hù)端的問(wèn)題。
問(wèn)題分析
從問(wèn)題上分析原因锐朴,造成圖片大小增大的途徑有兩個(gè)兴喂,其一是向服務(wù)器上傳圖片時(shí)造成圖片大小增大,其二是對(duì)圖片進(jìn)行尺寸剪裁是造成圖片大小增大焚志。而向服務(wù)器上傳圖片的途徑有客戶(hù)端上傳和網(wǎng)頁(yè)端上傳兩種衣迷。從這兩個(gè)途徑展開(kāi)調(diào)查。
網(wǎng)頁(yè)端圖片問(wèn)題調(diào)查
1.問(wèn)題檢查
我先來(lái)檢查一下網(wǎng)頁(yè)端是否會(huì)出現(xiàn)上文描述的問(wèn)題酱酬,按照問(wèn)題描述的步驟在網(wǎng)頁(yè)端進(jìn)行測(cè)試壶谒,使用的測(cè)試圖片如下:
就這兩張圖片進(jìn)行了上傳和剪裁測(cè)試,測(cè)試結(jié)果如下表:
從表中數(shù)據(jù)可以看出測(cè)試圖片2出現(xiàn)問(wèn)題描述的情況而測(cè)試圖片1未出現(xiàn)膳沽,所以網(wǎng)頁(yè)端存在描述問(wèn)題佃迄,需要調(diào)查原因泼差。
2.網(wǎng)頁(yè)端上傳圖片調(diào)查
調(diào)查是否是在網(wǎng)頁(yè)端上傳圖片后造成圖片大小增大,向服務(wù)器上傳之前兩張圖片再下載不進(jìn)行剪裁呵俏,測(cè)試結(jié)果如下表:
從表中可以看出網(wǎng)頁(yè)端上傳圖片后未造成圖片大小增大堆缘,所以不是上傳圖片造成圖片大小增大的。
3.網(wǎng)頁(yè)端剪裁圖片調(diào)查
調(diào)查是否是在網(wǎng)頁(yè)端使用服務(wù)器剪裁圖片的API造成圖片大小增大的普碎,對(duì)兩張測(cè)試圖片進(jìn)行剪裁得到測(cè)試結(jié)果如下表:
從表中數(shù)據(jù)可以看出圖片剪裁后可能造成圖片大小增大吼肥,并非必然現(xiàn)象,分析了一下原因麻车,可能與圖片的Exif信息不同有關(guān)缀皱,檢查兩張圖片的Exif信息,其中一個(gè)屬性吸引了我注意动猬,就是quality屬性啤斗,就是jpg等有損壓縮圖片格式的質(zhì)量值,理論上這個(gè)值越大圖片質(zhì)量越好圖片大小越大赁咙,測(cè)試圖片1.jpg的quality值為80钮莲,測(cè)試圖片2.jpg的quality值為60,并且這個(gè)quality值在我使用的服務(wù)器剪裁圖片API中也是個(gè)非必選的參數(shù)彼水,既然是非必選那必然有個(gè)默認(rèn)值崔拥,查文檔是75,那問(wèn)題的原因就了然了凤覆。
可以得出推論:如果進(jìn)行剪裁的圖片的quality小于75且剪裁的尺寸不大的情況下后造成圖片大小增大問(wèn)題链瓦,原因是剪裁后圖片的quality被修改成75,如果剪裁的圖片的quality為75大小則正常變化盯桦。
為了印證推論再進(jìn)行對(duì)兩張測(cè)試圖片進(jìn)行圖片剪裁測(cè)試慈俯,測(cè)試結(jié)果如下表所示:
從兩表的數(shù)據(jù)可以看出,符合推論的內(nèi)容拥峦,所以證明推論正確贴膘。
4.問(wèn)題調(diào)查結(jié)論
服務(wù)器網(wǎng)頁(yè)端存在描述問(wèn)題,造成原因?yàn)閷?duì)quality低于75的圖片進(jìn)行小幅度剪裁時(shí)事镣,剪裁方法會(huì)將剪裁圖片的quality修改為75使其圖片大小增大步鉴。
Android客戶(hù)端圖片問(wèn)題調(diào)查
1.問(wèn)題檢查
網(wǎng)頁(yè)端出現(xiàn)描述問(wèn)題揪胃,但不排除客戶(hù)端會(huì)出現(xiàn)同樣問(wèn)題璃哟,檢查客戶(hù)端服務(wù)器API文檔發(fā)現(xiàn)和網(wǎng)頁(yè)端一致,所以網(wǎng)頁(yè)端出現(xiàn)的問(wèn)題客戶(hù)端同樣會(huì)出現(xiàn)喊递,網(wǎng)頁(yè)端和客戶(hù)端的區(qū)別在于客戶(hù)端上傳圖片之前會(huì)對(duì)圖片進(jìn)行壓縮處理具體代碼如下圖所示:
從代碼中可以看出在圖片進(jìn)行壓縮之前調(diào)用Bitmap.compress壓縮方法此時(shí)的目的僅僅是想將Bitmap對(duì)象轉(zhuǎn)換成字節(jié)流對(duì)象不對(duì)圖片進(jìn)行壓縮随闪,上網(wǎng)查看公認(rèn)的說(shuō)法是compress方法的quality參數(shù)設(shè)置成100就是不進(jìn)行壓縮,所以此次預(yù)設(shè)成100骚勘,之后再判斷字節(jié)流對(duì)象大小如果大于200kb進(jìn)行壓縮處理铐伴。
為了檢查客戶(hù)端是否會(huì)出現(xiàn)服務(wù)器api以外原因造成的圖片問(wèn)題撮奏,對(duì)客戶(hù)端進(jìn)行圖片上傳測(cè)試,由于圖片大小大于200kb會(huì)進(jìn)行壓縮当宴,所以使用大小小于200kb的圖片進(jìn)行測(cè)試畜吊,測(cè)試結(jié)果如下表所示:
從表中數(shù)據(jù)可以看出圖片在客戶(hù)端上傳后出現(xiàn)大小增大問(wèn)題,而且圖片的quality值也增大了户矢,所以需要調(diào)查原因玲献。
2.問(wèn)題調(diào)查
從源碼中可以看出造成圖片大小增大的原因只能是Bitmap.compress方法,查看官方描述文字如下圖所示:
從圖中對(duì)參數(shù)quality的描述發(fā)現(xiàn)梯浪,并沒(méi)有說(shuō)明quality設(shè)置成100后不對(duì)Bitmap對(duì)象進(jìn)行壓縮捌年,所以之前理解的compress方法的使用可能存在問(wèn)題,得出推論compress方法的quality參數(shù)含義為將處理后圖片的quality值設(shè)置成參數(shù)值挂洛,也就是如果quality參數(shù)的值與處理圖片的quality值相等礼预,那么處理后圖片的大小將不變。
為了印證推論在客戶(hù)端進(jìn)行圖片上傳測(cè)試虏劲,測(cè)試時(shí)將compress方法的quality參數(shù)設(shè)置成與處理圖片的quality相同的值也就是75托酸,測(cè)試結(jié)果如下表所示:
?
?從表中數(shù)據(jù)可以得出推論正確。
3.問(wèn)題結(jié)論
客戶(hù)端存在網(wǎng)頁(yè)端相同的問(wèn)題原因一致伙单,且出現(xiàn)上傳圖片后圖片大小增大的新問(wèn)題获高,造成原因?yàn)樵趫D片大小低于200kb且quality低于100的情況進(jìn)行Bitmap.compress(參數(shù)quality設(shè)置為100)進(jìn)行處理后圖片的quality被修改為100從而使其圖片大小增大。
Android客戶(hù)端圖片上傳優(yōu)化
根據(jù)客戶(hù)端圖片問(wèn)題調(diào)查得出的結(jié)論可知吻育,在圖片無(wú)需壓縮調(diào)用Bitmap.compress方法時(shí)念秧,將參數(shù)quality設(shè)置成處理圖片的quality值,處理后的圖片將不會(huì)變大布疼,所以需要事先得出處理圖片的quality值摊趾,實(shí)現(xiàn)方法源碼如下圖所示:
從源碼中可以看出是查看圖片的Exif信息再在其中查找quality信息,所以圖片如果沒(méi)有Exif信息或者Exif信息缺失則無(wú)法得到quality的值游两。在這種情況下對(duì)代碼進(jìn)行進(jìn)一步優(yōu)化砾层,優(yōu)化代碼如下圖所示:
從源碼中可以看出通過(guò)反復(fù)對(duì)圖片進(jìn)行壓縮處理,根據(jù)處理后的圖片大小從而得出圖片的quality的值贱案。其實(shí)此代碼還可以進(jìn)一步優(yōu)化的肛炮,因?yàn)槊看味际菑膓uality為100開(kāi)始?jí)嚎s,如果圖片的quality比較低宝踪,那么循環(huán)將很耗時(shí)侨糟,這同樣不是我們想要的結(jié)果,我們可以通過(guò)圖片的大小和分辨率通過(guò)計(jì)算預(yù)估出quality值瘩燥,再進(jìn)行循環(huán)方法使quality值更加精確秕重,這樣將是更好的處理方法。
總結(jié)
出現(xiàn)上文描述的問(wèn)題厉膀,主要的原因是我們對(duì)服務(wù)器API接口的默認(rèn)參數(shù)值的疏忽溶耘,還有對(duì)Android客戶(hù)端Bitmap.compress方法的quality參數(shù)的誤解造成的二拐,尤其是后者我在網(wǎng)上查閱了很多文章,都將compress方法的quality參數(shù)設(shè)置成100理解為不進(jìn)行圖片壓縮凳兵,這是大家普遍的誤解百新,往往就是這些我們?nèi)菀缀鲆暤氖虑椋瑫?huì)造成一些很難處理的問(wèn)題庐扫,我寫(xiě)本文的目的吟孙,就是想給大家分享一下我調(diào)查此事的經(jīng)驗(yàn),希望大家不要出現(xiàn)我們這樣的問(wèn)題聚蝶。