「ゲームプログラミング/画像ファイルの作成プログラム」の版間の差分

削除された内容 追加された内容
PNGフォーマットの記述を開始
637 行
に書き換えておいたあと、カラーパレットに相当する部分でたとえば 0xFF, 00, 00, 00, を 0x00, 00, 0xFF, 00, に書き換えたら、今まで青だったところが赤に変わります。
 
== ビットマップ構造体 ==
=== 2bitカラー ===
ビットマップの2bit カラーのモノクロ2諧調で下記のように5×3でキャンバスに色を塗ると、機械語は下記のようになります。
 
782 ⟶ 783行目:
00 F2 FF
をたとえば FF 00 00 に変えれば、ビットマップ画像の左下が青く変わります。
 
== PNGフォーマット ==
例によって 横 5× 縦 3 の黄色画像を作って調べてみましょう
 
結果は
:89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 05 00 00 00 03 08 02 00 00 00 D4 54 52 AF 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 05 00 00 00 09 70 48 59 73 00 00 0E C3 00 00 0E C3 01 C7 6F A8 64 00 00 00 11 49 44 41 54 18 57 63 F8 FF 09 05 E1 E7 7F 62 00 00 CA 27 1D 20 62 9D 09 11 00 00 00 00 49 45 4E 44 AE 42 60 82
です。
 
これは意味は
<pre>
 
89 50 4E 47 0D 0A 1A 0A // PNGで表すことを示す決まり文句/ 50 4E 47 がASCIIでPNGだが、直前の 89 によりPが別文字になることも
 
// イメージヘッダ (通常 合計25バイトまで)
00 00 00 0D // データ長さ 常に13
49 48 44 52 // ASCII でIHDR
 
//種類によって長さが変わるので、CRCで終端チェック
00 00 00 05 // 画像の幅
00 00 00 03 // 画像の高さ
08 // ビット深度
02 // カラータイプ
00 // 圧縮手法
00 // フィルター 普通0
00 // インターレースの有無。0なら無し。1であり。
D4 54 52 AF // CRC
 
// ここまでイメージヘッダ(バイトを数えると、きとんと25バイトある)
 
00 00 00 01 // データサイズ. 下記 sRGB なら「1」
73 52 47 42 // AcCIIで sRGB
00 // レンダリング目的
AE CE 1C E9 // CRC
 
00 00 00 04 // データサイズ. gAMAなら 4
67 41 4D 41 // AcCIIで gAMA ガンマ
00 00 B1 8F // ガンマ値
0B FC 61 05 // CRC
 
00 00 00 09 // データサイズ. pHYs なら 9
70 48 59 73 // AcCIIで pHYs
00 00 0E C3 // x軸上の単位あたりのピクセル数. 十進で 3779
00 00 0E C3 // y軸上の単位あたりのピクセル数. 十進で 3779
01 // 単位指示 1ならメートル
C7 6F A8 64 // CRC
 
// IDAT
00 00 00 11 // 長さ。この場合、十進で17
49 44 41 54 // ASCII で IDAT
18 57 63 F8 FF 09 05 E1 E7 7F 62 00 00 CA 27 1D 20 // 長さで定義した17個
62 9D 09 11 // CRC
 
// 12バイトのイメージ終端
00 00 00 00 // 値は常に0
49 45 4E 44 // ASCII で IEND
AE 42 60 82 // 必ず 0xAE 0x42 0x60 0x82 . 終端をあらわす
 
</pre>
 
CRCは巡回検査符号というものです。