有时候三方分享传入缩略图的时候, 原图尺寸太大导致分享失败. 因此需要对图片进行下压缩处理, 这里进行了两种图片压缩的处理方式, 可以保证图片压缩后的清晰度.
质量压缩方法
UIImageJPEGRepresentation(<#UIImage * _Nonnull image#>, <#CGFloat compressionQuality#>)
大小压缩
//压缩图片为指定大小
- (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size {
// 并把它设置成为当前正在使用的context
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
// 绘制改变大小的图片
[img drawInRect:CGRectMake(0,0, size.width, size.height)];
// 从当前context中创建一个改变大小后的图片
UIImage* scaledImage =UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();
//返回新的改变大小后的图片
return scaledImage;
}
上面两种方法虽然可以压缩图片。但是效果不太理想,第一种质量压缩总是无法很准确的压缩到相应大小,第二种尺寸压缩有时候因为所需大小比较小,就造成了图像太过模糊,影响效果,所以最后采用两种方法结合的方式进行压缩,先压缩质量,尽可能保证图片的尺寸不发生变化,如果没有达到压缩要求,再相应的压缩图片尺寸,这样压缩之后就能尽可能的保证图片的清晰度了。
质量大小压缩相结合
- (UIImage *)compressSizeAndQualityImage:(UIImage *)image toByte:(NSUInteger)maxLength {
CGFloat compressQuality = 1;
NSData *data = UIImageJPEGRepresentation(image, compressQuality);
if (data.length < maxLength) {
//质量小于压缩大小
return image;
}
/*压缩质量*/
//指定大小压缩比例
compressQuality = (CGFloat)maxLength/(CGFloat)data.length;
data = UIImageJPEGRepresentation(image, compressQuality);
UIImage *resultImage = [UIImage imageWithData:data];
if (data.length < maxLength) {
//质量小于压缩大小
return resultImage;
}
/*压缩大小*/
NSUInteger lastDataLenth = 0;
while (data.length > maxLength && data.length != lastDataLenth) {
lastDataLenth = data.length;
//计算压缩比例
CGFloat compressSize = (CGFloat) maxLength/(CGFloat)data.length;
CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(compressSize)), (NSUInteger)(resultImage.size.height * sqrtf(compressSize)));
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
[resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
data = UIImageJPEGRepresentation(resultImage, 1);
}
return resultImage;
}