Использование UIKit требует, чтобы вы делали это в главном потоке (последние версии iOS утверждают, что работают в фоновых потоках, но в моих тестах это не имело место).
Более быстрый (или более отзывчивый) способ сделать это - сделать это в фоновом потоке, используя Quartz, как было описано.Проблема в том, что процесс фактически становится асинхронным.Вам понадобится какая-то форма обратного вызова.Примером имени метода может быть
- (void)generateMergedImageWith:(UIImage *)aImage callback:(mergeCallbackBlock)callback
(вместо этого он может быть делегатом, соответствующим некоторому протоколу, если вы предпочитаете не использовать обратные вызовы блоков; если вы хотите использовать блок, вам нужно ввести typedef 'mergeCallbackBlock 'соответственно)
Пример (непроверенный, извлеченный из рабочего приложения) может выглядеть следующим образом:
CGImageRef firstCGImage = [self CGImage];
CGImageRef secondCGImage = [aImage CGImage];
// we presume the two images are equal size, or that the two images should be the size of self
CGSize size = [self size];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
// below context presumes a number of things about the images and may need to be more aware
CGContextRef ctx = CGBitmapContextCreate(NULL, size.width, size.height,
8, size.width * 4, CGImageGetColorSpace(firstCGImage),
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
// we presume ctx succeeded; it may be NULL if it did not
CGContextDrawImage(ctx, (CGRect){CGPointZero, size}, firstCGImage);
CGContextDrawImage(ctx, (CGRect){CGPointZero, size}, secondCGImage);
CGImageRef result = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
// we presume result succeeded; it is NULL if it did not succeed for some reason
dispatc_async(dispatch_get_main_queue(), ^{
// back on main thread we create the resulting UIImage
UIImage *image = [[UIImage alloc] initWithCGImage:result];
CGImageRelease(result);
callback(image); // if a protocol, e.g. [thatObject didGenerateMergedImage:image];
[image release];
});
});