2011-01-07 3 views
5

私は2つのUIImagesをマージするために、以下のコードを使用しています。
より速い方法があるのだろうか。 UIKitのを使用して(iphone)高速UIImageの合成(マージ)?

- (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; 
} 
+0

それはちょうどあなたが扱っている画像のサイズが考えられます。適切)

例(未テスト、作業のアプリから引き出さ)のように見えるかもしれませんか? UIImageが自分のバンドルからのものである場合は、ImageOptimを使用してUIImageを小さくしてみてください。 – prince

+0

ラッパーの代わりにクォーツの関数を使用すると、CGContextDrawImageなどのようにクォーツの関数を使用する方が高速になると思いますが、最大の優位性は画像のサイズにあります。 – Andrea

+0

結果はそのままイメージになります。イメージが完全にオーバーレイされます...だからマージは何ですか? –

答えて

0

では、メインスレッド(のiOSの最新バージョンは、バックグラウンドスレッド上で動作するように主張するが、これは私のテストの場合のように見えていない)でそれを行うことが必要です。

Quartzを使用してバックグラウンドスレッドで実行する方が速い(またはより応答性の高い)方法です。問題は、プロセスが効果的に非同期になることです。コールバックの形式が必要になります。あなたがブロックを使いたいならば、あなたは「mergeCallbackBlock」をtypedefをする必要があります。メソッド名の例は

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

が(それはあなたがブロックコールバックを使用しない場合は、代わりにいくつかのプロトコルに準拠したデリゲートすることができかもしれません

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]; 
    }); 
});