有时候一些功能需要上传规定大小的图片,所以我们要对图片进行压缩。
- 思路:
图片质量压缩 + 图片尺寸压缩
首先对图片进行压缩,遍历压缩后当图片压缩到一定程度时,继续循环压缩会没有效果,那么可以把图片大小缩小一半(我这里是缩小0.5,可自行定义),然后继续执行压缩。
代码:
/**
* 压缩图片使图片文件小于指定大小
* @param maxLength 压缩最大长度
*/
- (NSData *)compressQualityWithMaxLength:(NSInteger)maxLength
{
CGFloat compression = 1;
NSData *data = UIImageJPEGRepresentation(self, compression);
if (data.length < maxLength) return data;
CGFloat max = 1;
CGFloat min = 0;
for (int i = 0; i < 6; ++i) {
compression = (max + min) / 2;
data = UIImageJPEGRepresentation(self, compression);
if (data.length < maxLength * 0.9) {
min = compression;
} else if (data.length > maxLength) {
max = compression;
} else {
break;
}
}
if (data.length > maxLength) {
UIImage *nImage = [self drawImageBySize:CGSizeMake(self.size.width*0.5, self.size.height*0.5)];
data = [nImage compressQualityWithMaxLength:maxLength];
}
return data;
}
// 根据 aSize 返回一个新的image
- (UIImage *)drawImageBySize:(CGSize)aSize; {
UIGraphicsBeginImageContext(aSize);
[self drawInRect:CGRectMake(0, 0, aSize.width, aSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}