補間方法を指定してUIImageを縮小する(1)

MeeeeP でどうしても吹き出しの文字がぼやてしまうので、補間方法を指定して画像のリサイズを行う方法をいろいろ試してみました。

概要

補間方法は以下の関数で指定できる

void CGContextSetInterpolationQuality (
   CGContextRef c,
   CGInterpolationQuality quality
);

qualityとして指定できる定数は以下の4つ

kCGInterpolationDefault
デフォルトの品質
kCGInterpolationNone
補間を行わない
kCGInterpolationLow
低品質だが高速
kCGInterpolationHigh
高品質だが低速

デフォルト、なし、低、高の4種類ってことですが、具体的にどういう補間方法なのかな?
メーリングリストにも質問されてるけど返答ないみたい(http://lists.apple.com/archives/quartz-dev/2008/Feb/msg00004.html)。

多分「なし」はニアレストネイバー、「低」はバイリニア、「デフォルト」と「高」はどっちかがバイキュービックと予想。よくわかんないので実際にリサイズしてみました。

UIImageのリサイズはUIImage のリサイズ - iPhone will be interactive! - iPhoneアプリ開発グループにある通り。

テスト方法

試したコードは以下のとおり

- (UIImage *)resizeImage:(UIImage *)image 
                        withQuality:(CGInterpolationQuality)quality 
                                     rate:(CGFloat)rate
{
	NSDate *timer = nil;
	UIImage *resized = nil;
	CGFloat width = image.size.width * rate;
	CGFloat height = image.size.height * rate;
	
	timer = [NSDate date];
	UIGraphicsBeginImageContext(CGSizeMake(width, height));
	CGContextRef context = UIGraphicsGetCurrentContext();
	CGContextSetInterpolationQuality(context, quality);
	[image drawInRect:CGRectMake(0, 0, width, height)];
	resized = UIGraphicsGetImageFromCurrentImageContext();
	UIGraphicsEndImageContext();
	
	NSLog(@"time: %f", [[NSDate date] timeIntervalSinceDate:timer]);
	return resized;
		
}

縮小にはISP imaging-developers - システム計画研究所 画像処理研究プロジェクトのCZPのWindowsBMPをそのまま使用させていただきました。
このBMPを[UIImage imageNamed:]で読み込み、1/2(rate=0.5)でリサイズ、UIImageViewに表示するテストアプリを作成し、iPhone 3G上でスクリーンショットをとって比較してみました。

環境

  • Xcode 3.2.2
  • iPhone SDK3.1.3

結果

評価方法はISP imaging-developers - システム計画研究所 画像処理研究プロジェクトを参考いただくとして、予想通り「なし」はニアレストネイバー、「低」はバイリニア?

「デフォルト」と「高」は優秀な結果と言えそうです。画像端1ピクセルがなんかおかしいのはバイキュービックだから?
このテストでは私の目と環境では両者に有意な差を感じれれませんでした。というかおんなじ?


漫画の縮小ならコントラストがはっきりでる「低」でもよいかも。速度次第だけど「高」はあんまり意味なさそう。

Default


None


Low


High

たぶん(2)に続く。