(iPhone) 快速合成 UIImage(合并)?

5
我正在使用以下代码合并两个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;
}

可能只是你正在处理的图像大小问题?如果UIImage来自你自己的捆绑包,请尝试使用ImageOptim将其缩小。 - prince
我猜如果你使用Quartz函数而不是包装器,比如CGContextDrawImage等等,速度会更快...但最大的差别来自于你的图像大小。 - Andrea
结果始终将是aImage,因为它完全覆盖了图像...那么合并有什么影响呢? - Peter Lapisu
什么是合并?你想做什么? - OFRBG
Peter:如果后者具有透明度,则不会完全覆盖前者。我猜这就是 Eugene 所做的。 - Kalle
UIGraphicsBeginImageContext(self.size); 这里的'size'是什么? - Raju
1个回答

0

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

更快(或更响应)的方法是使用Quartz在后台线程中执行。但问题在于该过程有效地变成了异步。您将需要某种形式的回调。方法名称的示例可能是

- (void)generateMergedImageWith:(UIImage *)aImage callback:(mergeCallbackBlock)callback

如果您不想使用块回调,可以使用符合某些协议的委托;如果您想使用块,则需要适当地定义“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];
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接