Два способа поместить изображение в графический контекст - что лучше? - PullRequest
4 голосов
/ 22 января 2011

Я заметил примеры двух способов поместить изображения в основную графику.Один намного проще, чем другой.Так в чем же преимущество второго, более сложного подхода?Это быстрее?

пример 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 ]

4 голосов
/ 22 января 2011

Непосредственно сравнивая их, преимущество второго метода заключается в том, что он не помещает изображение в кэш +[UIImage imageNamed:]. Вы не можете удалить изображения из этого кэша, поэтому лучше не использовать imageNamed:.

Однако вы можете получить лучшее из обоих миров.

Прежде всего, используйте -[NSBundle URLForResource:withExtension:], чтобы получить URL-адрес изображения. Это упрощает этот шаг при получении пути к каталогу ресурса или URL-адреса и добавлении к нему имени файла.

Во-вторых, используйте +[UIImage imageWithContentsOfURL:] для создания изображения, передавая URL, полученный от NSBundle.

Оттуда продолжайте, как в первом примере. Всего будет только пять строк (две из них заменяют первую строку вашего первого примера).

0 голосов
/ 22 января 2011

Я не знаю никаких преимуществ для второго способа. Недостатком является наличие большего количества шагов. Если вы используете первый способ и имеете UIImage, и вам нужен CGImageRef, вы можете получить к нему доступ через свойство CGImage. Я использую первое чаще всего. Если у вас есть UIImage, вы можете использовать свой собственный UIImageView, чтобы добавить его в иерархию представлений, или вы можете назначить его напрямую некоторым объектам UIKit, таким как UViewableViewCell's imageView. Если вы получите CGImageRef (второй способ), вам нужно будет imageWithCGImage: first ...

0 голосов
/ 22 января 2011

В примере 1 вы просто покажете изображение на виде в том виде, как оно есть, и также неплохо показать статические изображения.

Но в примере 2 вы используете базовую графику для отображения изображения, так чтоВы можете выполнять с ним больше операций, чем просто статичное изображение.Вы можете вращать его, масштабировать, переводить, уменьшать его альфа-значение и многое другое, о чем я также не знаю.

, так что это зависит от вашего выбора использования.хотите ли вы просто показать изображение или хотите сделать что-то большее, чем это. Если вы начинающий и хотите разрабатывать служебные приложения, чем я не думаю, что вы когда-либо будете использовать 2 варианта.но если вы хотите разрабатывать игры или анимировать изображение, которое вы будете использовать, следует выбрать вариант 2.

Cheers

...