戻る 05. 一枚絵の表示 次へ


やはりまともな画像を表示したいですよね。
今回はいわゆる「一枚絵」を表示してみましょう。

前回の説明で順番に色情報を入れていくことで画像が表示されるのは
わかったと思います。
すると写真等の色データを順に渡していくとその画像が表示されるはずです。
そこで問題があります。

3万2千色=15ビットです。

さてどうやってこの形式で渡しましょう?
GBAはパソコンと違い外部ファイルを読み込んだりも出来ません。
画像データも結合して一つのファイルにしなければいけません。

画像データもプログラムに組み込みましょう!
原理的にはわかりやすいですね。
組み込んでしまえば問題ありません。というかそうしか出来ないです。

次の問題です。
どうやって組み込みましょう?

色情報を配列情報として持たすことで可能です。

さらに次の問題です。
配列情報ってどんな形式?

実はこれが少し問題です。
画像を編集したりした事がある人はわかると思いますが
保存形式で2色や16色や256色や1677万色と言った形式で保存できるのは多いです。
しかし3万2千色もしくは6万5千色で画像を保存すると言うツールは..そうそう無いでしょう...
(少なくとも私は使ったこと無いです)
暗礁に乗り上げましたね..

しかもソースに組み込むためバイナリ形式では困ります。
画像を15ビットカラー形式でなおかつソースに組み込めて16ビット長テキスト形式で
出力できてある程度の画像形式にも対応できる。
&使いやすければ使いやすいほど良い..

結論:「無いものは作りましょう。」

ということでGBA形式の15ビットカラー画像へ変換するツールを作ってみました。

これです

const unsigned short cg[]={
	0x6f5c,0x737c,0x779d,0x7b9e,.....
といった形式で出力されます。
この0x6f5c等が色情報です。中身は15ビットカラーです。

動作原理:
 元の24ビットカラー画像を15ビットカラーに変換して出力します。
  1.rrrrrrrrggggggggbbbbbbbb 元の状態
  2.rrrrrxxxgggggxxxbbbbbxxx 下位3ビットをクリア
  3.   rrrrr   ggggg   bbbbb 同じく
  4.        0rrrrrgggggbbbbb 詰める(先頭ビットは0)

使い方:
 起動すると黒く塗りつぶされたWindowが開きます。
 変換したい画像(JPEG・PNGに対応)をほりこんでください。
 out.txtと言うファイルが出力されます。
 それをGBAのソースに組み込みましょう
extern unsigned short cg[];//別ファイルとしている画像データを参照する int main(void){ int x, y; char r, g, b; *(unsigned short *)0x4000000=3 | 0x0400; //VRAMに転送していく for(y=0;y<160;y++){ for(x=0;x<240;x++){ *(unsigned short *)(0x06000000 + (x + y * 240) * 2)=cg[y*240+x]; } } while(1){ } } スクリーンショット 手元にあった桜の画像を縮小して表示してみました。