Scale2x
Scale2xとは、アップスケーリングのアルゴリズムのひとつである。
概要
画像の拡大縮小のアルゴリズムとしてはニアレストネイバーやバイリニア、バイキュービック、Lanczos、NoHalo、LoHaloなどが有名だ。
一方、Scale2xは「整数倍」の大きさに拡大するときに非常に高画質を得られる。ペイントソフトに搭載されているような「パーセンテージで拡大率を指定する」用途にはまったく向いていないが、「整数倍」に拡大するのであれば非常に高速かつ高画質を得られるというものである。
この特性から低解像度なディスプレイの時代の古いゲームを、最近の高解像度なディスプレイが前提のゲーム機に移植する際などに広く採用されている。家庭用ゲーム機のエミュレーターでも定番のアルゴリズムとなっている。
Scale2xは1992年頃にルーカスアーツで働くEric Johnstonによって開発されたものであり、「Eric's Pixel Expansion (EPX) 」とも呼ばれる。ルーカスアーツのゲームエンジン「SCUMM」をIBM PC (320x200x256色)からMacintosh (640x480)に移植する際に考案したとされている。
現在scale2xのソースコードはオープンソースとなっている。ライセンスはGPLである。
その後、Scale3xなどの拡張アルゴリズムも続々と考案されている。
アルゴリズム
まず以下のような9ピクセルの画像があるとする。
A | B | C |
D | E | F |
G | H | I |
中央のピクセルEを4分割する。この4ピクセルが拡大先である。
A | B | C | |
D | E0 | E1 | F |
E2 | E3 | ||
G | H | I |
4分割されたピクセルE群の各値は以下のように計算する。
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;
これは次のように書き換えることができる。この僅かながら最適化されたコードは2001年ごろに各種ゲーム機のエミュレーターとして有名な「MAME」に搭載されたものであり、 「AdvMAME2x」と呼ばれる。
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;
さらに次のように書き換えることができる。
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;
}
分割対象となるピクセルEが境界線上の場合は、境界線上にもっとも近いピクセルの値を利用して計算される。たとえばピクセルEが画像の右端にあり、ピクセルCFIがない状態の場合は、ピクセルBEHの値をピクセルCFIとして計算する。