将图像放入图形上下文的两种方法 - 哪个更好?

时间:2011-01-22 06:50:54

标签: iphone objective-c cocoa-touch uikit core-graphics

我已经注意到将图像放入核心图形的两种方法的示例。一个比另一个简单得多。那么第二种更复杂的方法有什么优势呢?它更快吗?

示例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);

3 个答案:

答案 0 :(得分:4)

直接比较两者,第二种方法的优点是它不会将图像放入+[UIImage imageNamed:]缓存中。您无法从该缓存中删除图像,因此最好不要使用imageNamed:

但是,你可以充分利用这两个方面。

首先,使用-[NSBundle URLForResource:withExtension:]获取图片的网址。这简化了获取资源目录路径或URL并自行附加文件名的步骤。

其次,使用+[UIImage imageWithContentsOfURL:]创建图像,传递从NSBundle获得的URL。

从那里继续,如第一个例子。总数将只有五行(其中两行代替第一个示例的第一行)。

答案 1 :(得分:0)

在示例1中,您只是要在视图中显示图像,并且显示静态图像也很好。

但在示例2中,您使用核心图形来显示图像,以便您可以对其执行更多操作,而不仅仅是静态图像。你可以旋转它,缩放它,翻译它,降低它的alpha值以及我还不知道的更多。

所以这取决于您的使用选择。无论你是想展示图片还是想让它做更多的事情。如果你是初学者并且想要开发实用程序应用程序而不是我认为你将使用2选项。但如果您想开发游戏或想要为图像设置动画,您将使用2选项。

干杯

答案 2 :(得分:0)

我不知道第二种方式有什么好处。它具有更多步骤的缺点。如果您使用第一种方式并拥有UIImage并且需要CGImageRef,则可以通过CGImage属性访问它。我发现自己经常使用第一个。当你有一个UIImage时,你可以使用你自己的UIImageView将它添加到一个视图层次结构中,或者你可以直接将它分配给一些UIKit对象,比如UITableViewCell的imageView。如果你得到CGImageRef(第二种方式)那么你需要imageWithCGImage:首先......