(iphone)快速UIImage组合(合并)?

eug*_*ene 5 iphone merge uiimage

我正在使用下面的代码合并两个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;
}
Run Code Online (Sandbox Code Playgroud)

Kal*_*lle 0

使用 UIKit 要求您在主线程上执行此操作(最新版本的 iOS 声称可以在后台线程上工作,但在我的测试中似乎并非如此)。

一种更快(或更灵敏)的方法是使用 Quartz 在后台线程中执行此操作,如前所述。这样做的问题是该过程实际上变成了异步。您将需要某种形式的回调。方法名称的示例可能是

- (void)generateMergedImageWith:(UIImage *)aImage callback:(mergeCallbackBlock)callback
Run Code Online (Sandbox Code Playgroud)

(如果您不想使用块回调,它可以是符合某些协议的委托;如果您确实想使用块,则需要适当地输入 def '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];
    });
});
Run Code Online (Sandbox Code Playgroud)