2011-01-22 36 views
4

我注意到了將圖像放入核心圖形的兩種方法的示例。一個比另一個簡單得多。那麼第二個更復雜的方法有什麼優勢呢?速度更快嗎?將圖像放入圖形上下文的兩種方式 - 哪種更好?

例如1個

UIImage *myImage = [UIImage imageNamed:@"picture.png"]; 
CGRect imageRect = CGRectMake(70, 330, 40, 40); 
[myImage drawInRect:imageRect]; 
[myImage release]; 

例如2

// Load image from application bundle 
NSString* imageFileName = [[[NSBundle mainBundle] resourcePath]   stringByAppendingPathComponent:@"picture.png"]; 
CGDataProviderRef provider = CGDataProviderCreateWithFilename([imageFileName UTF8String]); 
CGImageRef image = CGImageCreateWithPNGDataProvider(provider, NULL, true,  kCGRenderingIntentDefault); 
CGDataProviderRelease(provider); 

// Draw image 
CGContextTranslateCTM(context, 70, 370); 
CGContextScaleCTM(context, 1.0, -1.0); 
CGContextDrawImage(context, CGRectMake(0, 0, 40, 40), image); 
CGImageRelease(image); 

回答

4

直接比較兩者,第二種方法的優點是它不會將圖像放入+[UIImage imageNamed:]緩存中。您無法從該緩存中移除圖片,因此您最好不要使用imageNamed:

然而,你可以得到兩全其美。

首先,使用-[NSBundle URLForResource:withExtension:]獲取圖像的URL。這簡化了獲取資源目錄路徑或URL並將文件名附加到它的步驟。

其次,使用+[UIImage imageWithContentsOfURL:]來創建圖像,傳遞從NSBundle獲取的URL。

從那裏繼續,就像你的第一個例子。總數將只有五行(其中兩個替換第一個示例的第一行)。

0

在例1中,你只是要展示在視圖中的圖像,因爲它是我們的,也不錯,顯示靜態圖像。

但在示例2中,您正在使用核心圖形來顯示圖像,以便您可以對其執行更多操作,而不僅僅是靜態圖像。你可以旋轉它,縮放它,翻譯它,降低它的alpha值,還有更多我也不知道的東西。

所以它取決於您的使用選擇。無論你是想顯示圖像還是想讓它做更多的事情。如果你是開發者,並且想開發實用程序應用程序,那麼我不認爲你會使用2個選項。但如果您想開發遊戲或想要爲圖像製作動畫,則應使用「應該2」選項。

乾杯

0

我不知道第二種方法的優點。它具有更多步驟的缺點。如果您使用第一種方式並使用UIImage,並且您需要CGImageRef,則可以通過CGImage屬性訪問它。我發現自己經常使用第一個。當你有一個UIImage時,你可以使用你自己的UIImageView把它添加到視圖層次結構中,或者你可以直接將它分配給一些UIKit對象,比如UITableViewCell的imageView。如果你得到了CGImageRef(第二種方法),那麼你將需要imageWithCGImage:第一種...