公司的項(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ì)。謝謝廓握!