+ (CGRect)imageCompressForWidthScale:(UIImage *)sourceImage targetWidth:(CGFloat)defineWidth {
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = defineWidth;
CGFloat targetHeight = height / (width / targetWidth);
CGSize size = CGSizeMake(targetWidth, targetHeight);
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
CGPoint thumbnailPoint = CGPointMake(0.0, 0.0);
if (CGSizeEqualToSize(imageSize, size) == NO) {
CGFloat widthFactor = targetWidth / width;
CGFloat heightFactor = targetHeight / height;
if (widthFactor > heightFactor) {
scaleFactor = widthFactor;
}else {
scaleFactor = heightFactor;
}
scaledWidth = width * scaleFactor;
scaledHeight = height * scaleFactor;
if (widthFactor > heightFactor) {
thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
}else if (widthFactor < heightFactor) {
thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
}
}
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width = scaledWidth;
thumbnailRect.size.height = scaledHeight;
return thumbnailRect;
}
+ (UIImage *)imageCompressWithSourceImage:(UIImage *)sourceImage rect:(CGRect)thumbnailRect {
UIImage *newImage = nil;
[sourceImage drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
if (newImage == nil) {
NSLog(@"scale image fail");
}
UIGraphicsEndImageContext();
return newImage;
}
如果不需要知道CGRect可以將兩個(gè)方法合成一個(gè)瞬矩,直接返回UIImage
調(diào)用方法:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageString]];
UIImage *image = [UIImage imageWithData:data];
CGRect targetRect = [UIImage imageCompressForWidthScale:image targetWidth:SCREEN_WIDTH];
UIImage *img = [UIImage imageCompressWithSourceImage:image rect:targetRect];
dispatch_async(dispatch_get_main_queue(), ^{
completeBlock(img, targetRect);
});
});
我這里是獲取的網(wǎng)絡(luò)圖片,所以加了異步處理,如果是本地圖片可以直接使用分類方法