@interface UIImage (ZDCompress)
/**
将图片压缩到指定宽度,保持原来图片的宽高比
@param width 图片宽度
@return image
*/
- (UIImage *)zd_compressToWidth:(CGFloat)width;
/**
将图片在子线程中压缩,block在主线程回调,保证压缩到指定大小,尽量减少失真
@param length 大小,100K就是100*1024
@param block 完成回调
*/
- (void)zd_compressToDataLength:(NSInteger)length block:(void(^)(NSData *data))block;
@end
- (UIImage *)zd_compressToWidth:(CGFloat)width {
if (width <= 0 || [self isKindOfClass:[NSNull class]]) return nil;
if (width >= self.size.width) return self;
CGSize newSize = CGSizeMake(width, width * (self.size.height / self.size.width));
UIGraphicsBeginImageContext(newSize);
[self drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
- (void)zd_compressToDataLength:(NSInteger)length block:(void(^)(NSData *data))block {
if (length <= 0 || [self isKindOfClass:[NSNull class]]) return;
NSData *originalData = UIImagePNGRepresentation(self);
if (length >= originalData.length) {
block(originalData);
return;
}
dispatch_async(dispatch_get_global_queue(0, 0), ^{
UIImage *newImage = [self copy];
NSData *data = UIImageJPEGRepresentation(newImage, 1.0);
if (data.length / 1024 < 1024) {
NSLog(@"图片压缩前的大小:%luKB", data.length / 1024);
} else {
NSLog(@"图片压缩前的大小:%.2fMB", (float)data.length / 1024 / 1024);
}
NSLog(@"------------------图片开始压缩------------------");
CGFloat scale = 0.9;
NSData *jpgData = UIImageJPEGRepresentation(newImage, scale);
while (jpgData.length > length) {
newImage = [newImage zd_compressToWidth:newImage.size.width * scale];
NSData *newImageData = UIImageJPEGRepresentation(newImage, 0.0);
if (newImageData.length < length) {
newImageData = UIImageJPEGRepresentation(newImage, scale);
while (newImageData.length > length) {
scale -= 0.1;
if (scale < 0) break;
newImageData = UIImageJPEGRepresentation(newImage, scale);
}
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"------------------图片完成压缩------------------");
NSLog(@"图片压缩后的大小:%luKB", newImageData.length / 1024);
block(newImageData);
});
return;
}
}
});
}
网友评论