2011-11-16 60 views
10

各位高手显卡,我想知道这两个方法之一是调整一个UIImage更好:调整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; 
} 

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

回答

0

这是一个高层次和低层次的方法。

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

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

很难判断算法...

+0

低级方法=在调整大小后保持质量更好吗? @tom –

+0

我想UIImage的drawInRect方法将在内部使用CGContextDrawImage ... – Tom

4

第二个是线程安全的。

+1

这是为什么被拖垮了? 1:因为声明是错误的? 2:因为线程是irellevant - >它不是。如果你想要一个高性能的应用程序,把调整大小的任务放到另一个线程中是一个好方法。 – esbenr

1

这是一个相当迟的回复,但我会继续前进并添加它。

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

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

因此,无论何时在肖像模式下拍摄照片时,最终结果都会失真。无论何时宽度为<高度,这些扭曲都可以通过翻转宽度和高度来轻松处理。

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

我想这与基于图形上下文的行为有关。第二种方法不使用这个上下文,并且在我的情况下它完美地工作。

0

您可能想要调整图像的大小有很多不同的方法。即使您有新宽度和新高度的情况下,您可能要将图像调整为新的大小并忽略比例,或者按比例缩放图像并裁剪为新的大小。

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