iOS之圖片壓縮

公司的項(xiàng)目有上傳圖片的需求,拍攝的圖片和從相冊(cè)中獲取的圖片都比較大, 如果直接發(fā)送很耗費(fèi)用戶的流量,體驗(yàn)性很不好, 因此要求項(xiàng)目在發(fā)送之前需要先進(jìn)行壓縮沽一。目前項(xiàng)目中的圖片可能存在三種類型:JPEG芽淡、PNG、GIF褥傍。
不同類型圖片的壓縮不一樣,比如我們要求 PNG 的壓縮要保留透明像素。GIF 圖片是有多幀圖片組成的,GIF 圖片的壓縮和PNG 或 JPEG 圖片的壓縮也是不一樣的政己。
針對(duì)不同類型的圖片需要有不同的處理方式杯缺,系統(tǒng)給出的壓縮圖片的API有兩個(gè),UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality);UIImagePNGRepresentation(UIImage * __nonnull image);匿醒,前者必須接受一個(gè)JPEG類型圖片的UIImage對(duì)象 和壓縮質(zhì)量场航,后者必須接收一個(gè)PNG類型圖片的UIImage的對(duì)象。但其實(shí)后者并不能真正做到壓縮PNG圖片廉羔,因此針對(duì)-PNG類型的圖片必須采用另外的辦法來(lái)壓縮圖片旗闽。

處理方式

針對(duì)JPEG圖片, 可以直接采用系統(tǒng)的UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality);方法蜜另,然后傳遞一個(gè)期望的圖片壓縮質(zhì)量的參數(shù);針對(duì)PNG圖片嫡意,沒(méi)辦法采用系統(tǒng)的UIImagePNGRepresentation(UIImage * __nonnull image);方法來(lái)壓縮圖片举瑰,我們采用裁剪和重繪圖片的方式來(lái)實(shí)現(xiàn) PNG 圖片的壓縮,這樣就可以實(shí)現(xiàn)壓縮PNG 圖片并且保留透明像素蔬螟。

我為UIImage添加了兩個(gè)category方法此迅,一個(gè)為傳遞UIImage參數(shù),另一個(gè)傳遞NSData參數(shù)旧巾。關(guān)鍵代碼如下:
壓縮 PNG:

UIImage *image = [UIImage imageWithData:imageData];
while (imageData.length > specifySize) {
??CGFloat targetWidth = image.size.width * 0.9;
??CGFloat targetHeight = image.size.height * 0.9;
??CGRect maxRect = CGRectMake(0, 0, targetWidth, targetHeight);
??UIGraphicsBeginImageContextWithOptions(
??CGSizeMake(floorf(targetWidth),
??floorf(targetHeight)), NO, [UIScreen mainScreen].scale);
??[image drawInRect:maxRect];
??image = UIGraphicsGetImageFromCurrentImageContext();
??UIGraphicsEndImageContext();
??imageData = UIImagePNGRepresentation(image);
}

壓縮 JPEG

UIImage *image = [UIImage imageWithData:imageData];
while (imageData.length > specifySize) {
??imageData = UIImageJPEGRepresentation(image, 0.9);
??image = [UIImage imageWithData:imageData scale:[UIScreen mainScreen].scale];
}

壓縮 GIF
GIF 壓縮是把每一幀都當(dāng)成 PNG 來(lái)處理,即重繪圖片,這樣可以保證壓縮后每一幀的尺寸大小都一樣,保證壓縮后播放 GIF 圖片能夠正常耸序。壓縮代碼請(qǐng)看 demo。

Demo地址
如果有錯(cuò)誤的或者可以增加和完善的地方,請(qǐng)不吝指出!
如果對(duì)你有幫助鲁猩,請(qǐng)不吝給一個(gè)start坎怪,就是對(duì)我最大鼓勵(lì)。謝謝廓握!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搅窿,一起剝皮案震驚了整個(gè)濱河市嘁酿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌男应,老刑警劉巖闹司,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沐飘,居然都是意外死亡游桩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)耐朴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)借卧,“玉大人,你說(shuō)我怎么就攤上這事隔箍∥酵蓿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蜒滩,是天一觀的道長(zhǎng)滨达。 經(jīng)常有香客問(wèn)我,道長(zhǎng)俯艰,這世上最難降的妖魔是什么捡遍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮竹握,結(jié)果婚禮上画株,老公的妹妹穿的比我還像新娘。我一直安慰自己啦辐,他們只是感情好谓传,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著芹关,像睡著了一般续挟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侥衬,一...
    開(kāi)封第一講書(shū)人閱讀 50,021評(píng)論 1 291
  • 那天诗祸,我揣著相機(jī)與錄音,去河邊找鬼轴总。 笑死直颅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怀樟。 我是一名探鬼主播功偿,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漂佩!你這毒婦竟也來(lái)了脖含?” 一聲冷哼從身側(cè)響起罪塔,我...
    開(kāi)封第一講書(shū)人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎养葵,沒(méi)想到半個(gè)月后征堪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡关拒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年佃蚜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片着绊。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谐算,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出归露,到底是詐尸還是另有隱情洲脂,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布剧包,位于F島的核電站恐锦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疆液。R本人自食惡果不足惜一铅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堕油。 院中可真熱鬧潘飘,春花似錦、人聲如沸掉缺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眶明。三九已至暴凑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赘来,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工凯傲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犬辰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓冰单,卻偏偏與公主長(zhǎng)得像幌缝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诫欠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容