標籤:
理解概念
首先,我們必須明確圖片的壓縮其實是兩個概念:
- “壓” 是指檔案體積變小,但是像素數不變,長寬尺寸不變,那麼品質可能下降。
- “縮” 是指檔案的尺寸變小,也就是像素數減少,而長寬尺寸變小,檔案體積同樣會減小。
圖片“壓”處理
對於“壓”的功能,我們可以使用UIImageJPEGRepresentation或UIImagePNGRepresentation方法實現,如:
| 123 |
NSData *imgData = UIImageJPEGRepresentation(image, 0.5); |
第一個參數是圖片對象,第二個參數是壓的係數,其值範圍為0~1。
UIImageJPEGRepresentation方法的官方注釋是:
return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
關於PNG和JPEG格式壓縮
UIImageJPEGRepresentation函數需要兩個參數:圖片的引用和壓縮係數而UIImagePNGRepresentation只需要圖片引用作為參數.
UIImagePNGRepresentation(UIImage \*image)要比UIImageJPEGRepresentation(UIImage* image, 1.0)返回的圖片資料量大很多.
同樣的一張照片, 使用UIImagePNGRepresentation(image)返回的資料量大小為199K,而UIImageJPEGRepresentation(image, 1.0)返回的資料量大小隻為140K,比前者少了59K.
如果對圖片的清晰度要求不是極高,建議使用UIImageJPEGRepresentation,可以大幅度降低圖片資料量.比如,剛才拍攝的圖片,通過調用UIImageJPEGRepresentation(image, 1.0)讀取資料時,返回的資料大小為140K,但更改壓縮係數為0.5再讀取資料時,返回的資料大小隻有11K,大大壓縮了圖片的資料量,而且清晰度並沒有相差多少,圖片的品質並沒有明顯的降低。因此,在讀取圖片資料內容時,建議優先使用UIImageJPEGRepresentation,並可根據自己的實際使用情境,設定壓縮係數,進一步降低圖片資料量大小。
提示:壓縮係數不宜太低,通常是0.3~0.7,過小則可能會出現黑邊等。
我們看一下筆者收集的UIImageJPEGRepresentation的資料表:
筆者統計了iphone裝置上的全屏圖和原始圖在壓縮前和壓縮後的大小,我們需要根據圖片壓縮後在PC上的清晰度來決定最終選擇哪個壓縮係數。
圖片“縮”處理
通過[sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)]可以進行圖片“縮”的功能。如下是筆者對圖片尺寸縮的api:
| 12345678910111213141516171819202122232425262728 |
/*! * @author 杜建超, 15-12-01 16:12:01 * * 壓縮圖片至目尺規寸 * * @param sourceImage 源圖片 * @param targetWidth 圖片最終尺寸的寬 * * @return 返回按照源圖片的寬、高比例壓縮至目標寬、高的圖片 */- (UIImage *)compressImage:(UIImage *)sourceImage toTargetWidth:(CGFloat)targetWidth { CGSize imageSize = sourceImage.size; CGFloat width = imageSize.width; CGFloat height = imageSize.height; CGFloat targetHeight = (targetWidth / width) * height; UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight)); [sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage;} |
我們對圖片只“壓”而不縮,有時候是達不到我們的需求的。因此,適當地對圖片“縮”一“縮“尺寸,就可以滿足我們的需求。
iOS圖片壓縮處理