IOS圖片壓縮

iPhone拍出來的照片通常大小在1-10M,咱們在上傳照片時,不可能上傳如此大的圖片到服務器,通常咱們會對照片進行壓縮。服務器

經常使用的作法是,使用這個函數對圖片壓縮 UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality); 但這個函數有一個臨界值,不能對圖片無限制壓縮,通常到當壓縮比傳入0.1已達到臨界值了。這時若是我想把5M的圖片壓縮到50K是行不通的。函數

若是圖太大,咱們要求壓縮的比例太大就不能使用以上的方法來壓縮,這時就要先對圖片裁剪,裁剪後再使用這個函數壓縮,這樣才能達到想要的大小。爲了避免使圖片變形,裁剪時要按原圖的寬高比來裁剪。能夠寫成UIImage的分類方法代碼以下:工具

 1 - (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize
 2 {
 3     UIImage *sourceImage = self;
 4     UIImage *newImage = nil;
 5     CGSize imageSize = sourceImage.size;
 6     CGFloat width = imageSize.width;
 7     CGFloat height = imageSize.height;
 8     CGFloat targetWidth = targetSize.width;
 9     CGFloat targetHeight = targetSize.height;
10     CGFloat scaleFactor = 0.0;
11     CGFloat scaledWidth = targetWidth;
12     CGFloat scaledHeight = targetHeight;
13     CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
14     
15     if (CGSizeEqualToSize(imageSize, targetSize) == NO)
16     {
17         CGFloat widthFactor = targetWidth / width;
18         CGFloat heightFactor = targetHeight / height;
19         
20         if (widthFactor > heightFactor)
21             scaleFactor = widthFactor; // scale to fit height
22         else
23             scaleFactor = heightFactor; // scale to fit width
24         scaledWidth= width * scaleFactor;
25         scaledHeight = height * scaleFactor;
26         
27         // center the image
28         if (widthFactor > heightFactor)
29         {
30             thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
31         }
32         else if (widthFactor < heightFactor)
33         {
34             thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
35         }
36     }
37     
38     UIGraphicsBeginImageContext(targetSize); // this will crop
39     
40     CGRect thumbnailRect = CGRectZero;
41     thumbnailRect.origin = thumbnailPoint;
42     thumbnailRect.size.width= scaledWidth;
43     thumbnailRect.size.height = scaledHeight;
44     
45     [sourceImage drawInRect:thumbnailRect];
46     
47     newImage = UIGraphicsGetImageFromCurrentImageContext();
48     if(newImage == nil)
49         NSLog(@"could not scale image");
50     
51     //pop the context to get back to the default
52     UIGraphicsEndImageContext();
53     return newImage;
54 }

而後給系統工具類寫一個壓縮圖片的類方法,根據不一樣大小的圖片採用不一樣大小的裁剪比和壓縮比,將壓縮後的圖片保證在50K左右的大小。this

 1 + (NSData *)compressWithOrgImg:(UIImage *)img
 2 {
 3     
 4     NSData *imageData = UIImageJPEGRepresentation(img, 1);
 5     float length = imageData.length;
 6     length = length/1024;
 7     NSLog(@"壓縮前的大小:%fKB",length);
 8     // 裁剪比例
 9     CGFloat cout = 0.5;
10     
11     // 壓縮比例
12     CGFloat imgCout = 0.1;
13     if(length > 25000){ // 25M以上的圖片
14         cout = 0.1;
15         imgCout = 0;
16     }else if(length > 10000){ // 10M以上的圖片
17         cout = 0.2;
18         imgCout = 0;
19     }else if (length > 5000) { // 5M以上的圖片
20         cout = 0.3;
21         imgCout = 0;
22     }else if (length > 1500) { // 若是原圖大於1.5M就換一個壓縮級別
23         cout = 0.7;
24         imgCout = 0.1;
25     }else if (length > 1000) {
26         cout = 0.8;
27         imgCout = 0.2;
28     }else if (length > 500) {
29         cout = 0.8;
30         imgCout = 0.3;
31     }else{
32         cout = 0.9;
33         imgCout = 50/length;
34     }
35     
36     
37     // 按裁剪比例裁剪
38     UIImage *compressImage =  [img imageByScalingAndCroppingForSize:CGSizeMake(img.size.width * cout, img.size.height *cout)];
39     
40     
41     // 那壓縮比例壓縮
42     imageData = UIImageJPEGRepresentation(compressImage, imgCout);
43     
44     length= imageData.length / 1024;
45     NSLog(@"裁剪比例:%f,壓縮比例:%f,壓縮後的大小:%fKB",cout,imgCout,length);
46     return imageData;
47 }
相關文章
相關標籤/搜索