Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

kCAFilteNearest

タグ: Quartz Mac iPhone Objective-C

CALayerのmagnificationFilterやminificationFilterにkCAFilteNearestを設定すると、レイヤの拡大(縮小)表示時に適用するフィルタが「線形補間」から「最近傍補間」に切り替わる。
この設定(拡大用・縮小用どちらか一方)は、レイヤを等倍表示する時にも適用される。
そして最近傍補間フィルタがどのピクセルを拾うかは、実行環境によってだいぶ変わってくる。

void addLayers(CALayer* superlayer)
{
#if TARGET_OS_IPHONE
	CGImageRef image =
		[UIImage imageNamed:@"rock.gif"].CGImage;
#else
	NSString* path =
		[[NSBundle mainBundle] pathForImageResource:@"rock.gif"];
	CGImageRef image =
		[[NSBitmapImageRep imageRepWithContentsOfFile:path] CGImage];
#endif
	CGRect imageRect = CGRectMake(0, 0, 32, 32);
	
	CALayer* layer;
	
	layer = [CALayer layer];
	layer.frame = CGRectOffset(imageRect, 1, 1);
	layer.contents = (id)image;
	[superlayer addSublayer:layer];
	
	layer = [CALayer layer];
	layer.frame = CGRectOffset(imageRect, 33.5, 1.5);
	layer.contents = (id)image;
	[superlayer addSublayer:layer];
	
	layer = [CALayer layer];
	layer.frame = CGRectOffset(imageRect, 65.5, 1.5);
	layer.contents = (id)image;
	layer.magnificationFilter = kCAFilterNearest;
	[superlayer addSublayer:layer];
	
	layer = [CALayer layer];
	layer.frame = CGRectOffset(imageRect, 97.5, 1.5);
	layer.contents = (id)image;
	layer.minificationFilter = kCAFilterNearest;
	[superlayer addSublayer:layer];
}

「rock.gif」は、[ロックマン9]ロックマンポーズ集から切り抜いた32x32の画像。
このコードを、まずはiPhoneで実行してみよう。
なお、細部を見やすくするため、キャプチャ画像は2倍に拡大している。

rock_iphone.png

一番左のレイヤはコンテンツとデバイスのピクセルが完全に一致しているため補間の必要がなく、元の画像がそのまま表示される。
それ以外のレイヤはピクセルが半分ずつずれており、左から「常に線形補間」「拡大時は最近傍補間」「縮小時は最近傍補間」されて表示される。
この結果を見る限り、iPhoneでは「等倍用フィルタ=縮小用フィルタ」であり、等倍の最近傍補間は、もとの画像をわりと忠実に再現してくれるようだ。

次はiPhone Simulator。

rock_simulator.png

Simulatorでは「等倍用フィルタ=拡大用フィルタ」となる。
足元がぼやけているが、これはレイヤ境界アンチエイリアスの効果だろう。

次、MacBook Pro(late 2008)。
(ちなみにOSは以下全てMac OS X 10.5.6)

rock_mbp2008late.png

「等倍用フィルタ=縮小用フィルタ」。
足の辺りが縦に1ピクセル重複している。

次、MacBook(early 2008)。

rock_mb2008early.png

なんかパチモンくさくなった。

最後、MacBook Pro(early 2006)。

rock_mbp2006early.png

自主規制補間。

以上、今回の例ではこのような結果になった。
実際のところ、iPhoneもピクセルのずれ具合によっては崩れるし、MacBookも常にパチモンを生み出しているわけではない(むしろ生み出さないことの方が多い)。
ピクセルがずれてもドット絵を綺麗に(ぼやけさせずに)表示してくれることを期待して最近傍補間を試してみたのだが、どうやらそういう用途に使えるものではなさそうだ。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/171-d88b791a
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。