補間方法を指定して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のWindows用BMPをそのまま使用させていただきました。
このBMPを[UIImage imageNamed:]で読み込み、1/2(rate=0.5)でリサイズ、UIImageViewに表示するテストアプリを作成し、iPhone 3G上でスクリーンショットをとって比較してみました。
環境
- Xcode 3.2.2
- iPhone SDK3.1.3
結果
評価方法はISP imaging-developers - システム計画研究所 画像処理研究プロジェクトを参考いただくとして、予想通り「なし」はニアレストネイバー、「低」はバイリニア?
「デフォルト」と「高」は優秀な結果と言えそうです。画像端1ピクセルがなんかおかしいのはバイキュービックだから?
このテストでは私の目と環境では両者に有意な差を感じれれませんでした。というかおんなじ?
漫画の縮小ならコントラストがはっきりでる「低」でもよいかも。速度次第だけど「高」はあんまり意味なさそう。