では、メインスレッド(の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];
});
});
それはちょうどあなたが扱っている画像のサイズが考えられます。適切)
例(未テスト、作業のアプリから引き出さ)のように見えるかもしれませんか? UIImageが自分のバンドルからのものである場合は、ImageOptimを使用してUIImageを小さくしてみてください。 – prince
ラッパーの代わりにクォーツの関数を使用すると、CGContextDrawImageなどのようにクォーツの関数を使用する方が高速になると思いますが、最大の優位性は画像のサイズにあります。 – Andrea
結果はそのままイメージになります。イメージが完全にオーバーレイされます...だからマージは何ですか? –