無為空間
むいむい(´ω`*)
Entries
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倍に拡大している。

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

Simulatorでは「等倍用フィルタ=拡大用フィルタ」となる。
足元がぼやけているが、これはレイヤ境界アンチエイリアスの効果だろう。
次、MacBook Pro(late 2008)。
(ちなみにOSは以下全てMac OS X 10.5.6)

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

なんかパチモンくさくなった。
最後、MacBook Pro(early 2006)。

自主規制補間。
以上、今回の例ではこのような結果になった。
実際のところ、iPhoneもピクセルのずれ具合によっては崩れるし、MacBookも常にパチモンを生み出しているわけではない(むしろ生み出さないことの方が多い)。
ピクセルがずれてもドット絵を綺麗に(ぼやけさせずに)表示してくれることを期待して最近傍補間を試してみたのだが、どうやらそういう用途に使えるものではなさそうだ。
コメント
コメントの投稿
トラックバック
- トラックバック URL
- http://idlysphere.blog66.fc2.com/tb.php/171-d88b791a
- この記事にトラックバックする(FC2ブログユーザー)