差分

ナビゲーションに移動 検索に移動

Scale2x

3,301 バイト追加, 2020年3月27日 (金) 02:29
ページの作成:「'''Scale2x'''とは、アップスケーリングアルゴリズムのひとつである。 == 概要 == 画像の拡大縮小のアルゴリズムとし…」
'''Scale2x'''とは、[[アップスケーリング]]の[[アルゴリズム]]のひとつである。

== 概要 ==
画像の拡大縮小の[[アルゴリズム]]としては[[ニアレストネイバー]]や[[バイリニア]]、[[バイキュービック]]、[[Lanczos]]、[[NoHalo]]、[[LoHalo]]などが有名だ。

一方、Scale2xは「2の倍数」の大きさに拡大するときに非常に高画質を得られる。[[ペイントソフト]]に搭載されているようなパーセンテージで拡大率を指定する用途にはまったく向いていないが、「2の倍数」に拡大するのであれば非常に高速かつ高画質を得られるというものである。

この特性から低解像度な[[ディスプレイ]]の時代の古い[[ゲーム]]を、最近の高解像度なディスプレイが前提の[[ゲーム機]]に移植する際などに広く採用されている。


Scale2xは1992年頃にルーカスアーツで働くEric Johnstonによって開発されたものであり、「Eric's Pixel Expansion (EPX) 」とも呼ばれる。ルーカスアーツの[[ゲームエンジン]]「[[SCUMM]]」を[[IBM PC]] (320x200x256色)から[[Macintosh]] (640x480)に移植する際に考案したとされている。

現在scale2xの[[ソースコード]]は[[オープンソース]]となっている。[[ライセンス]]は[[GPL]]である。

* http://scale2x.sourceforge.net/

その後、Scale3xなどの拡張アルゴリズムも続々と考案されている。

== アルゴリズム ==
まず以下のような9[[ピクセル]]の画像があるとする。
{| class="wikitable"
|+
|A
|B
|C
|-
|D
|E
|F
|-
|G
|H
|I
|}
中央のピクセルEを4分割する。
{| class="wikitable"
|+
|A
| colspan="2" |B
|C
|-
| rowspan="2" |D
|E0
|E1
| rowspan="2" |F
|-
|E2
|E3
|-
|G
| colspan="2" |H
|I
|}
4分割されたピクセルE群の各値は以下のように計算する。<syntaxhighlight lang="c">
E0 = D == B && B!= F && D!= H?D:E;
E1 = B == F && B!= D && F!= H?F:E;
E2 = D == H && D!= B && H!= F?D:E;
E3 = H == F && D!= H && B!= F?F:E;
</syntaxhighlight>これは次のように書き換えることができる。この僅かながら最適化されたコードは2001年ごろに各種ゲーム機のエミュレーターとして有名な「MAME」に搭載されたものであり、 「AdvMAME2x」と呼ばれる。<syntaxhighlight lang="c++">
E0 = D == B && B!= H && D!= F?D:E;
E1 = B == F && B!= H && D!= F?F:E;
E2 = D == H && B!= H && D!= F?D:E;
E3 = H == F && B!= H && D!= F?F:E;

</syntaxhighlight>さらに次のように書き換えることができる。<syntaxhighlight lang="c">
if(B!= H && D!= F){
E0 = D == B?D:E;
E1 = B == F?F:E;
E2 = D == H?D:E;
E3 = H == F?F:E;
} else {
E0 = E;
E1 = E;
E2 = E;
E3 = E;
}

</syntaxhighlight>分割対象となるピクセルEが境界線上の場合は、境界線上にもっとも近いピクセルの値を利用して計算される。たとえばピクセルEが画像の右端にあり、ピクセルCFIがない状態の場合は、ピクセルBEHの値をピクセルCFIとして計算する。

== 関連項目 ==

* [[SAA5050]]
* [[Scale2x]]
* [[Scale3x]]
* [[waifu2x]]

案内メニュー