ぼくは航空管制官2 改造資料1 ~ぼく管2専用画像形式「iph」ファイル~

この「改造資料」シリーズでは、これまでのシナリオ改造やその他の改造についていろいろと調べた内容をまとめています。
あくまで私が調べた範囲内での内容なので間違ってたり気づいた点等あったら指摘していただけると幸いです。


さて、今回は、「ぼく管2」で使用されている画像形式、「iphファイル」を解析した結果をまとめています。
このiphファイル、昔とある掲示板にてSusie用プラグインを使用することにより表示することは可能であるということを知りましたが、Susie用プラグインであるため、残念ながら表示のみで編集はできませんでした。
それで最近になってiphファイルの構造を調査して分かったことをまとめたので、ここで公開することにします。
正直自分でも解析できると思わずiph改造できるのは夢のまた夢だと思ってました・・・
見てくださった方もいるかもしれませんがあの動画(要ニコニコアカウント)に今回の解析結果が使用されています。


・・・前置きはともかく、iphファイルの構造を以下にまとめます。

1,ヘッダ


まずは、以下にヘッダと推定される部分を示します(正直殆ど変更することのない部分なのであまり解析していません)。ここでは先頭から0x38byteをヘッダとします。
画像


すべての箇所において変更する必要はありません。どのファイルでもだいたいここは固定です。


2,データ部のヘッダ


謎な名称になってしまっていますが、ヘッダの先、0x20byteがデータの内容を示す部分です。この部分もヘッダですが、「1,」のヘッダと違い、ファイルごとに設定する部分が存在します。
また、一部未解明な部分もありますが、その部分は殆どのファイルで共通なので無視しても問題ないと思われます。
画像


ここではいくつか設定しなければならない部分が存在します。
0x04byte目(ファイル先頭から0x3Cbyte目、画像では8C 06 00 00)のDWORD値は0x38byteからファイル末尾までの長さを格納しています。

0x08byte目(画像では50 00)のWORD値は画像の幅を示しています。
0x0Abyte目(画像では0E 00)のWORD値は画像の高さを示しています。

0x10byte目(画像では28 00)のWORD値は1パターンの幅を示しています。
0x12byte目(画像では0E 00)のWORD値は1パターンの高さを示しています。

最低限この部分についてはファイル毎に変更しなければなりません。


3,データ部


いよいよ画像データの本体です。iphファイルは画像に示す5つのパターンが分かると大体の画像は理解できます。また、データ部はとあるデータを除いてビッグエンディアンで記述されています。
画像


まず、赤で囲ってある「01」ですが、これは1行分のデータの始まりを示しています。
ヘッダ直後と、次に説明する「FF 00 FF」の直後に現れます。

次に、紫で囲ってある「FF 00 FF」ですが、これは「FF」がデータの終わりを示します。
・・・すると、このデータだけで2回分データが終わっていることになるのですが、これで正しいです。
なぜならばこのiphファイルは1行あたり2つのデータを持っているのです。
1つは前半に記述されているピクセルに設定する色、そしてもう1つが透過設定です。この画像ファイルでは透過設定をしていないので最初の「FF」の後が「00」のみのデータになっています。そして、その次の「FF」で1行分のデータを終了させていると推測されます。

さて、次は水色で囲っている「6F F6」ですが、これこそピクセル毎の色を示しています。
しかしこの色、ちょっと厄介で、普段滅多に使うことの無いであろう「16bitカラー(RGB555)」で示しているのです。
どういうことかというと、まず、この「6F F6」を2進数に変換します。すると、「01101111 11110110」となります。
さらにこれを次のように分割します。

0 - 11011 - 11111 - 10110

既に文字に色をつけているのでだいたい分かると思いますが、そうです。各5ビットずつ計15ビットでRGBの色を表しているのです。
この場合、それぞれ10進数に変換すると「273122」となります。
しかしこの値、あくまで「16ビットカラー」での色なので普段使用されている「24ビットカラー」の値に変換しないと不便です。
計算方法は簡単です。「255 / 31 = 8.22580645...」この値を各色の値に掛けてやればいいのです。
また、小数点以下の値が出る場合、切り上げます(ぼく管2のシステムでは切り上げでした)。
早速計算してみます。

27 * 8.22580645 = 222.0 = 222
31 * 8.22580645 = 255 = 255
22 * 8.22580645 = 180.9 = 181

そして、これを表示させてみると、このような色になります。
この色、ちょっと見づらいですが、ゲームをやったことがあればピンとくるかもしれません。
そうです。出発機のストリップカラーがこの色でした。
と、こうして色を取得することができます。


・・・しかし、ここで項目冒頭に示した画像を見返してみると、このデータの次、「D6」を緑色で囲ってあります。
ここがiphファイルの非常に面倒な点その1です。
単純に上に示したようなデータが続けばいいのですが、圧縮のために各色の値の変位が一つ手前の各色の値±2以内の場合、圧縮データとして1byteで表記できるという点です。

例えば、1つ手前が「20、25、31」でこのデータの次の値が「21、23、31」だったとします。
すると、それぞれ前のデータから「+1、-2、±0」となっています。
これを圧縮データで示すと「D5」とだけ書けば済みます。わざわざ2byte使わなくていいのは良いのですが、解析する身としてはこれが面倒でした・・・
ちなみに、この圧縮データは、値が「80~FD」となっているものです。具体的には
80が赤-2、緑-2、青-2
81が赤-1、緑-2、青-2
・・・
84が赤+2、緑-2、青-2
85が赤-2、緑-1、青-2
・・・
98が赤+2、緑+2、青-2
99が赤-2、緑-2、青-1
・・・
となっています。

また、値からそれぞれの変位を求めるには次のように計算すれば求まります(xは調べるバイナリ値)。
赤:((x - 0x80) % 25 % 5) - 2
緑:((x - 0x80) % 25 / 5) - 2
青:((x - 0x80) / 25) - 2

逆は・・・やってないので分かりませんが、上の式を逆にすれば大体求まるのと思います。

・・・さらに次のオレンジで囲ってある4byte、FE 02 F8 6Fですが、これは同じピクセルデータの繰り返しを意味します。それぞれ分解すると以下のようになっています。
FE・・・繰り返しデータの開始を意味します。
02・・・繰り返し回数を指定します。ただし、実際に繰り返される回数はここの値+1回なので注意。
F8 6F・・・繰り返す色データを指定します。何故かここだけリトルエンディアンで記述されています(非常に面倒な点その2)。なので6F F8として、上記に示したように16ビットカラーの色解釈をしてください。


基本的にiph画像ファイルはこのように構成されています。その他、透過データ部(1回目のFF~2回目のFFまでのデータ)も存在しますが、未調査なので掲載しません。

私が調べたのは最低限の解析情報ですが、その他、何か情報をご存知でしたら教えていただけると非常に嬉しいです。


そして・・・最後にここまで見てくださった方へ少しばかりお礼を・・・
上記の解析結果を基にiphとbmpファイルの相互変換を行うソフトウェアを作成しました。
といっても試験的に作ったソフトウェアなのでノークレームでお願いします。
また、上記に書いた圧縮表記だの繰り返し表記だのは読み込みだけで書き込み時は無圧縮で書き出します。(まあ、ちゃんと表示されてるし大丈夫だよね・・・?)
例の動画のハーレクイーンロゴもこれで変換しました。
※念のため付属のReadme.txt(超適当)もお読みください。
ダウンロード(OneDrive) ※解凍passは「iphconv」です(すべて半角英小文字)。

TOP

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック