2010-01-01
■ Core Graphicsを使った画像のグレースケール変換と、その速度

「画像処理をしてみたいな」と思って、つい先日購入したErica女史のクックブック第2版*1を読んでいたら、通常のピクセル処理ではなくてCore GraphicsのColorSpaceを使用したグレースケール変換が紹介されていたので、少し調べてみました。
何を調べたかというと、変換速度です。
iPhoneのカメラアプリは画像の変換処理でどうしても時間がかかってしまうので、少しでも速く変換できる方法はないかなと思いまして。
計測用のテストコードは以下のとおりです。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { // imageView.image = [[info objectForKey:UIImagePickerControllerEditedImage] retain]; [picker dismissModalViewControllerAnimated:YES]; UIImage *image; image = [info objectForKey:UIImagePickerControllerOriginalImage]; CGSize size = image.size; CGRect rect = CGRectMake(0.0f,0.0f, size.width, size.height); // // a) Quartzによるグレースケール変換 NSDate* a_dateStart = [NSDate date]; // グレースケールの色空間を作成し、そこに画像を描画して結果を取得する CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGContextRef context = CGBitmapContextCreate(nil, size.width, size.height, 8, 0, colorSpace, kCGImageAlphaNone); CGColorSpaceRelease(colorSpace); CGContextDrawImage(context, rect, [image CGImage]); CGImageRef grayscale = CGBitmapContextCreateImage(context); CGContextRelease(context); //image = [UIImage imageWithCGImage:grayscale]; CFRelease(grayscale); //imageView.image = image; NSDate* a_dateEnd = [NSDate date]; NSTimeInterval a_time = [a_dateEnd timeIntervalSinceDate:a_dateStart]; NSLog(@"elapsed time(CG):%lf", a_time); // // b) ピクセル処理によるグレースケール変換 // 参考サイト:「実践! iPhoneアプリ開発 カメラアプリの作り方 (4) - 写真にエフェクトをかける」 // http://journal.mycom.co.jp/column/iphone/004/index.html a_dateStart = [NSDate date]; // 生データを取得して各ピクセルに変換処理をかける CGDataProviderRef dataProvider; dataProvider = CGImageGetDataProvider(image.CGImage); CFDataRef data; UInt8* buffer; data = CGDataProviderCopyData(dataProvider); buffer = (UInt8*)CFDataGetBytePtr(data); size_t width, height, bytesPerRow; width = CGImageGetWidth(image.CGImage); height = CGImageGetHeight(image.CGImage); bytesPerRow = CGImageGetBytesPerRow(image.CGImage); // ビットマップに効果を与える NSUInteger i, j; for (j = 0; j < height; j++) { for (i = 0; i < width; i++) { UInt8* tmp; tmp = buffer + j * bytesPerRow + i * 4; UInt8 r, g, b; r = *(tmp + 3); g = *(tmp + 2); b = *(tmp + 1); UInt8 y; y = (77 * r + 28 * g + 151 * b) / 256; *(tmp + 1) = y; *(tmp + 2) = y; *(tmp + 3) = y; } } a_dateEnd = [NSDate date]; a_time = [a_dateEnd timeIntervalSinceDate:a_dateStart]; NSLog(@"elapsed time(Manual):%lf", a_time);
以上のコードをiPhone 3GS 16GBのフルサイズカメラ画像で数回試したところ、結果は
方式 | 経過時間(秒) |
---|---|
Core Graphicsの色空間 | 2.2sec |
ピクセルの手処理 | 1.8sec |
と、当初の予想を覆す「手処理の方が速い」という結果になりました。
・・・あらま。
Core Graphicsの効果をなんだかこう、色々と期待していたのですが、残念。
uwinokotio2019/04/03 13:48http://theprettyguineapig.com/amoxicillin/ - Amoxicillin 500mg Capsules <a href="http://theprettyguineapig.com/amoxicillin/">Amoxicillin 500mg</a> xab.bjzi.iphone-dev.g.hatena.ne.jp.hvn.ai http://theprettyguineapig.com/amoxicillin/
efopeyipemueb2019/04/03 18:31http://theprettyguineapig.com/amoxicillin/ - Amoxicillin 500mg <a href="http://theprettyguineapig.com/amoxicillin/">Amoxicillin</a> gns.xveo.iphone-dev.g.hatena.ne.jp.mci.yg http://theprettyguineapig.com/amoxicillin/