调整UIImage的方法哪个更好,为什么?

时间:2011-11-16 18:53:06

标签: iphone ios cocoa-touch graphics core-graphics

对于你们所有的图形专家来说,我想知道这两种方法中哪一种更适合调整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;  
}

所以我的问题是,哪种方式更好,为什么?

4 个答案:

答案 0 :(得分:4)

第二个是线程安全的。

答案 1 :(得分:1)

这是一个相当晚的回复,但我会继续添加它。

除了prestanda之外,我实际上发现了两种方法之间的一些行为差异。

在我的照片应用中,我有自定义相机视图,可将任何拍摄的图像发送到自定义图像编辑器。在应用程序中,自定义相机/编辑器视图是横向独占的。但是,原生相机窗口本身并非如此。

因此,只要在肖像模式下拍摄照片,最终结果就会失真。每当宽度<1时,通过翻转宽度和高度就可以容易地处理这些变形。高度。

上述两种方法(简单方法)的第一种方法导致图像旋转90度并仍然失真。然而,第二个完美地调整了图像的大小!

我猜这与基于图形上下文的行为有关。第二种方法不使用这种上下文,它在我的情况下完美无缺。

答案 2 :(得分:0)

这是一种高级别和低级别的方法。

哪个更好?取决于你的目标。

高级方法更具可读性(对我而言),也许低级方法的速度快一纳秒(没有测试)。

判断算法很难......

答案 3 :(得分:0)

您可能希望调整图像大小的方式有很多种。即使您有新宽度和新高度的情况,您可能要么想要将图像调整为新尺寸并忽略比例,要么按比例缩放图像并裁剪为新尺寸。

有一个项目有一个干净的API:https://github.com/mustangostang/UIImage-Resize。它使用第一种方法: - )