PPMをC#で解析の続き
*今回は、自分でも何を言っているかよくわかりません。いろいろと変でも気にしないでください。*
とりあえず、読み込む。
u.animeOffsetSize = br.ReadUInt32(); u.animeSpecialInfo = br.ReadUInt32(); u.animeOffsetTable = new uint[u.frameLength + 1]; for (int i = 0; i < u.frameLength + 1; i++) { u.animeOffsetTable[i] = br.ReadUInt32(); }
さて、これを表示しよう。
MessageBox.Show(u.animationSize.ToString() + "\n" + u.animeOffsetSize + "\n" + string.Join(",",( from x in u.animeOffsetTable select x.ToString()).ToArray()));
・・・エラー。
そうか。ターゲットフレームワークを下げたからLINQが使えないのか。
LINQが使えないなんて、困るので再びフレームワークを3.5に引き上げ。
無事表示されました。
それでいくつか研究を。
まず、animeOffsetSizeは、やはりオフセットテーブルのサイズでした。
ページ数*4になります。
ちなみに、frameLengthはページ数-1なので注意。
オフセットテーブルはパス。
その後のフレームヘッダです。
簡単なメモで試した結果を2進表示
10010011
色を反転したもの
10010010
やはり最後のビットは紙の色ですね。
さらに、上紙の色を青に。
10010110
確認してみます。
1 => 前のページとの差分があるか(1 => あり)
00 => 不明
10 => 下紙の色(10 => 2 => 赤)
11 => 上紙の色(11 => 3 => 青)
となっています。
どうやら、正しいようですね。
続いて、画面に入っていきます。
最初の48byteの意味が前翻訳したときにはわかりませんでしたが、どうやら、ラインエンコード方式(2bit)が、192ライン分 => 48byteのようです。
ちなみに、一度同フォルダのメモ、強制消去に出会いました。
改めて、もっとわかりやすい実験メモを作り、研究再開。
この画像のイメージ図。青いのは画面の端ということ
なんと、フレームが後ろのページから保存されているっぽいことを発見。
これはハメなんじゃないだろうか。
00,00,00,00,10,01,00,11,10,00,10,00,10,00,00,10,00,00,10,10このうしろは0(上が詰まっていないほう)
00,00,00,00,10,01,00,11,10,10,00,10,10,10,00,00,00,00,00,10このうしろは0(上が詰まっている方)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- !!,!!,!!,--,!!,--,!!,-----,!!,-- <= 違うところ
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
前の翻訳によると
00 スキップ
01 符号化
10 反転符号化
11 そのまま
ということでした。スキップも描画しないのか変化が無いのか。符号化とは?反転符号化とは(もしや、前のラインの色違いとか)?そのままとは、前のと変化が同じ?それとも生データのこと?
となぞだらけ。
とりあえず、もう少し研究。その結果、なんとなくつかめた。
まず、最初の2byte(10,01,00,11)はちがうデータっぽい気がする。
なので、それを読み飛ばす。
さらに、バイトごとにbitを総入れ替えすると、その下のものになる。
これは、上が詰まっている画像
10,00,10,00,10,00,00,10,00,00,10,10,
00,01,00,01,01,00,00,01,01,01,00,00,
これは上が開いている画像
10,10,00,10,10,10,00,00,00,00,00,10,
01,00,01,01,00,00,01,01,01,00,00,00,
これを01が黒、00が白と考えると!!!
そう、元の画像と同じになります。
やはり、00はスキップ、01は描画対象がある、ということのようです。(もしかすると、ライン分ごとひっくり返すのかもしれません。そうしたら、01は10です。)
ですが、結局10と11は出てこず。いったいこの二つとはなんだ。
で、ビット反転。p.line1に48の大きさのバイナリ配列です。
for (int i = 0; i < p.line1.Length; i++) { p.line1[i] = (byte)(((byte)((p.line1[i] << 7) & 0x80)) | ((byte)((p.line1[i] << 5) & 0x40)) | ((byte)((p.line1[i] << 3) & 0x20)) | ((byte)((p.line1[i] << 1) & 0x10)) | ((byte)((p.line1[i] >> 1) & 0x08)) | ((byte)((p.line1[i] >> 3) & 0x04)) | ((byte)((p.line1[i] >> 5) & 0x02)) | ((byte)((p.line1[i] >> 7) & 0x01))); }
書いていることもぐちゃぐちゃだけど疲れた。続いて本データの読み込みに挑戦してみようか。