我想在iPhone 6 plus上将(900 * 900)图片压缩为(600 * 600)。
如果我使用:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(600, 600), NO, 0)
生成的UIImage变为(1800 * 1800)。
如果我使用:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, 0)
或
UIGraphicsBeginImageContextWithOptions(CGSizeMake(600, 600), NO, 1)
生成的图像会模糊,这显然是错误的。
有解决这个问题的好方法吗?
这是代码
- (UIImage*)imageByScalingForSize:(CGSize)targetSize withSourceImage:(UIImage *)sourceImage
{
UIImage *newImage = nil;
//Omit scaledWidth/scaledHeight calculation
CGFloat scaledWidth = targetSize.width;
CGFloat scaledHeight = targetSize.height;
//UIGraphicsBeginImageContext(targetSize);
UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0);
CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = CGPointMake(0, 0);
thumbnailRect.size.width= scaledWidth;
thumbnailRect.size.height = scaledHeight;
[sourceImage drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
答案 0 :(得分:0)
试试这个lib!
的UIImage + Zoom.h
bottom:false
的UIImage + Zoom.m
#import <UIKit/UIKit.h>
enum {
enSvResizeScale, // image scaled to fill
enSvResizeAspectFit, // image scaled to fit with fixed aspect. remainder is transparent
enSvResizeAspectFill, // image scaled to fill with fixed aspect. some portion of content may be cliped
};
typedef NSInteger SvResizeMode;
@interface UIImage (Zoom)
- (UIImage*)resizeImageToSize:(CGSize)newSize resizeMode:(SvResizeMode)resizeMode;
@end
答案 1 :(得分:0)
如果我使用:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(600, 600), NO, 0)
生成的UIImage变为(1800 * 1800)。
这不太正确。确实,图像底层的位图是1800乘1800,但这并不是图像中唯一重要的东西; UIImage也有一个比例,比例为3.因此,UIImage实际上被处理(相对于屏幕几何)为600乘600,再加上它是三分辨率,以匹配Plus屏幕的三重分辨率 - 这正是你想要的。
(当然,如果您还使用原始图像的三分辨率版本开始,缩放效果最佳。但这是另一回事。)