(iphone) быстрая композиция UIImage (слияние)? - PullRequest
5 голосов
/ 07 января 2011

Я использую приведенный ниже код для объединения двух UIImages,
задаюсь вопросом, есть ли более быстрый путь.

- (UIImage*) combineImage: (UIImage*) aImage
{
    UIGraphicsBeginImageContext(self.size);
    [self drawInRect: CGRectMake(0, 0, self.size.width, self.size.height)];  
    [aImage drawInRect: CGRectMake(0, 0, self.size.width, self.size.height)];


    UIImage* combinedImage = UIGraphicsGetImageFromCurrentImageContext(); //                                                                                                                                                                                                  
    UIGraphicsEndImageContext();
    return combinedImage;
}

1 Ответ

0 голосов
/ 10 августа 2012

Использование 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];
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...