调整 UIImage 大小的哪种方法更好,为啥?
Posted
技术标签:
【中文标题】调整 UIImage 大小的哪种方法更好,为啥?【英文标题】:Which method to resize UIImage is better and why?调整 UIImage 大小的哪种方法更好,为什么? 【发布时间】:2011-11-16 18:53:05 【问题描述】:对于所有图形专家,我想知道这两种方法中哪一种更适合调整 UIImage 的大小:
我遇到的第一个既简单又流行,如下:
-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight
UIGraphicsBeginImageContext(CGSizeMake(resizedWidth ,resizedHeight));
[image drawInRect:CGRectMake(0, 0, resizedWidth, resizedHeight)];
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return result;
我在此链接http://iphonesdksnippets.com/post/2009/05/06/Resize-image-and-keep-aspect-ratio.aspx 找到的第二种方法似乎与上述方法相同,但要复杂得多(我不太明白其中发生了什么):
-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight
CGImageRef imageRef = [image CGImage];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmap = CGBitmapContextCreate(NULL, resizedWidth, resizedHeight, 8, 4 * resizedWidth, colorSpace, kCGImageAlphaPremultipliedFirst);
CGContextDrawImage(bitmap, CGRectMake(0, 0, resizedWidth, resizedHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage *result = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return result;
所以我的问题是,哪种方式更好,为什么?
【问题讨论】:
【参考方案1】:第二个是线程安全的。
【讨论】:
为什么会这样? 1:因为陈述错误? 2:因为线程是无关紧要的 -> 它不是。如果您想要一个高性能的应用程序,将调整大小的任务放到另一个线程中是一个不错的方法。【参考方案2】:这是一个相当晚的回复,但我还是会继续添加它。
我实际上发现了这两种方法之间的一些行为差异,除了 prestanda。
在我的照片应用程序中,我有自定义相机视图,可将任何拍摄的图像发送到自定义图像编辑器。在应用程序中,自定义相机/编辑器视图是横向专有的。但是,本机相机窗口本身不是。
因此,每当一张照片碰巧以纵向模式拍摄时,最终结果都会失真。每当宽度
上述两种方法中的第一种方法(简单的一种)导致图像旋转了 90 度并且仍然失真。然而,第二个完美地调整了图像的大小!
我猜这与基于图形上下文的行为有关。第二种方法不使用这种上下文,在我的情况下它可以完美地工作。
【讨论】:
【参考方案3】:这是一种高层次和低层次的方法。
哪个更好?取决于你的目标。
高级方法更具可读性(对我而言),也许低级方法快一纳秒(没有测试)。
算法很难判断...
【讨论】:
低级方法 = 调整大小后更好地保持质量? @tom【参考方案4】:您可能希望通过多种不同的方式调整图像大小。即使您有新的宽度和新的高度,您也可能希望将图像调整为新的大小并忽略比例,或者按比例缩放图像并裁剪为新的大小。
有一个项目有一个干净的 API 可以做到这一点:https://github.com/mustangostang/UIImage-Resize。它使用第一种方法:-)
【讨论】:
以上是关于调整 UIImage 大小的哪种方法更好,为啥?的主要内容,如果未能解决你的问题,请参考以下文章