2011-11-16 20 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。它使用第一種方法:-)

相關問題