调整 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 大小的哪种方法更好,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 React Native 中,这两种方法中哪种 Async Await 方法更好,为啥?

为啥从相机缩小 UIImage 这么慢?

通过保持纵横比和宽度调整 UIImage 的大小

UIImage 调整大小并裁剪以适合

vc编辑器中使用的哪种字体

按宽度按比例调整 UIImage 的大小