Hatena::Groupiphone-dev

Ni chicha, ni limona - 平均から抜けられない僕

2010-01-01

Core Graphicsを使った画像のグレースケール変換と、その速度 23:57  Core Graphicsを使った画像のグレースケール変換と、その速度 - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  Core Graphicsを使った画像のグレースケール変換と、その速度 - Ni chicha, ni limona - 平均から抜けられない僕  Core Graphicsを使った画像のグレースケール変換と、その速度 - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

「画像処理をしてみたいな」と思って、つい先日購入した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の効果をなんだかこう、色々と期待していたのですが、残念。

*1Amazonインスタントストアへのリンクです。色々と刷新され、今のトレンドに必要な情報がたくさん載った本に仕上がっていたので、このリンク経由でなくても一読してみることをオススメします。

uwinokotiouwinokotio2019/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/

efopeyipemuebefopeyipemueb2019/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/