カテゴリー別アーカイブ: Programming

PNGのIDATチャンクで悩んだ話

やりたくなってPNGを読み込むプログラムで悩んだことがあったので記録代わりに

今回は必須チャンクのみ。

ある程度書き終わってテストしていると読み込みに成功する画像と失敗する画像がある。
どうもIDATチャンクが複数に分かれている画像は読み込みに失敗しているらしい。

更に詳しく見てみると、1つ目以降のIDATチャンクのデータの伸長を失敗していた。

この時私はIDATのデータは1つ1つ伸長していくものだと思っていたが、どうやらすべてのデータを繋げた後に伸長をするようだ。

こんなことにしばらく悩んだことが腹立たしい。
そもそも何故IDATチャンクを複数に分ける必要があるのだろうか…
きっと意味があるのだろう。

IDATチャンクが複数あるときは連続しているようなので、割りと簡単にコードを書くことができた。

せっかくOculusを買ったというのに全く活用できないでいる。
こんなところで躓いていないでさっさとOculusを使ったゲームを作りたい。

BitmapのImageSizeに対する文句

しばらく前にBitmapを自力で読み込むコードを書いたのでそれに関する愚痴&メモ
Bitmapのフォーマットについては「BitMap フォーマット」でググればいくらでも説明が出てくるのでその辺の詳しい説明はなしで。

BITMAPINFOHEADERにはImageSizeとかSizeImageとか呼ばれる画像データ部のサイズを格納する部分がある。
しかしコイツが何の役にも立たない。というか邪魔だ。

Windowsのペイントでの保存やフォトビューワーで回転した後の保存ではImageSizeに0が書き込まれる(正常なサイズが入っていることもあったが違いは不明)。
ということは読み込みをする時には読み込んだImageSizeなど無視してその他の情報を元に自分で計算する必要がある。

GIMPでの保存時は正常な値が書き込まれていたが、ImageSizeが0のBitmapを読み込めるということは最初からその部分はあてにしていないのだろう。