iOS获取图片后指定宽度按比例缩放

+ (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可以将两个方法合成一个,直接返回UIImage
调用方法:

    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);
        });
    });

我这里是获取的网络图片,所以加了异步处理,如果是本地图片可以直接使用分类方法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容