首先,我們必須明確圖片的壓縮其實是兩個概念:
“壓” 是指文件體積變小,但是像素數不變,長寬尺寸不變,那么質量可能下降。
“縮” 是指文件的尺寸變小,也就是像素數減少,而長寬尺寸變小,文件體積同樣會減小。
圖片“壓”處理
對于“壓”的功能,我們可以使用UIImageJPEGRepresentation或UIImagePNGRepresentation方法實現,如:
NSData *imgData=UIImageJPEGRepresentation(image, 0.5);
第一個參數是圖片對象,第二個參數是壓的系數,其值范圍為0~1。
關于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的數據表:
圖片“縮”處理
通過[sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)]可以進行圖片“縮”的功能。如下是筆者對圖片尺寸縮的api:
- (UIImage*)compressImage:(UIImage*)sourceImage toTargetWidth:(CGFloat)targetWidth {CGSizeimageSize = sourceImage.size;CGFloatwidth = imageSize.width;CGFloatheight = imageSize.height;CGFloattargetHeight = (targetWidth / width) * height;
UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
[sourceImage drawInRect:CGRectMake(0,0, targetWidth, targetHeight)];UIImage*newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();returnnewImage;
}
我們對圖片只“壓”而不縮,有時候是達不到我們的需求的。因此,適當地對圖片“縮”一“縮“尺寸,就可以滿足我們的需求。
demo
//圖片壓縮處理
UIImage*img;
CGSizeimagesize = img.size;
if(imagesize.width>700) {
imagesize.width=700;
}
img = [weakSelf compressImage:imgto TargetWidth:imagesize.width];
NSData*imageData =UIImageJPEGRepresentation(img,0.5);
img = [UIImage imageWithData:imageData];
NSLog(@"%f",img.size.width);
NSLog(@"%@",img);