すみません。C++とは直接関係ありませんが
32bitビットマップファイルを作りたいのです。
42 4D A0 00 00 00 00 00 00 00 36 00 00 00 28 00
00 00 05 00 00 00 05 00 00 00 01 00 32 00 00 00
00 00 50 00 00 00 C4 0E 00 00 C4 0E 00 00 00 00
00 00 00 00 00 00 1C 1C 1C 00 20 20 20 00 30 30
30 00 40 40 40 00 60 60 60 00 00 0C 0C 0C 00 0C
0C 0C 00 1C 1C 1C 00 00 3C 3C 3C 00 5C 5C 5C 00
00 00 00 00 00 0C 0C 0C 00 1C 1C 1C 00 30 30 30
00 50 50 50 00 00 00 00 00 00 10 10 10 00 1C 1C
1C 00 3C 3C 3C 00 50 50 50 00 00 1C 1C 1C 00 20
20 20 00 2C 2C 2C 00 4C 4C 4C 00 60 60 60 00 00
読みづらくてすみません。
手書きでバイナリエディタを使って作ってみたんですが、
(フルカラーのものに無理矢理アルファ情報入れただけですが)
描画できないとビューアに表示されてしまいました。
何ででしょうか?
教えてください。お願いします。
提示された数値をちゃんとチェックしたわけではないのでわかりませんが、
これってビットマップファイルに必要なヘッダ情報は
ちゃんとファイルの先頭に入れてありますか?
独自に読み込む処理を作る場合はまた別の話になりますが、
一般のビューアやエディタで読み込みたい場合はそういった情報がないと
きちんと読み込めないのではないかと思います
もしビットマップファイルのフォーマットに関して知らないということなら、
まずその辺りから調べるといいと思います
もし的外れな場合は適当に聞き流してください(´・ω・`)
ヘッダは付いてるようですが、その内容が間違えていますね。
一つ目がファイルサイズの記述ミスです。
5×5の32bitであれば、データだけで0x00000064バイト
さらにヘッダー分(36バイト)足して0x0000009Aバイト
パディングが付くので0x0000009Cバイトが正しいサイズです。
どこにサイズが入るかはBMPのフォーマットを調べてください。
次にカラービット数がまちがえてます。
その記述だと50ビットカラーになってます。
32を16ビットで表記しなければいけないのでこの場合は0x20ですね。
これもどこに設定するかはフォーマットを調べればすぐわかります。
#BMPフォーマットのドキュメントはごろごろしてますのですぐ見つかると思います。
#BMPFILEHEADER,BMPINFOHEADERあたりで探せばすぐかも
訂正です。
誤)32を16ビットで表記しなければいけないのでこの場合は0x20ですね。
正)32を16進数で表記しなければいけないのでこの場合は0x20ですね。
> 憂さん
ご親切にありがとうございます。
ヘッダ情報が変だったみたいですね。
すみません。
> ねこたまさん
わざわざ解読してくださってすみませんでした。
32を16進法に直すことには全く気づきませんでした。
でもパディングの分は各行末に含まれてるらしいので
0x0000009Cじゃなくて0x0000009F(辺り)じゃないのですか?
ファイルサイズの計算がいまひとつピンときません。
バイナリエディタの終点までのアドレスじゃだめなんですか?
32bpp なら、パディングはつかないんじゃない?
ところで、ヘッダ 36 バイトって根拠は何?
ちなみに、厳密には BITMAPINFOHEADER ではアルファチャンネルは使えないので、
BITMAPV4HEADER を使わなければなりません。
よって、ヘッダサイズは最低でも 122 バイト。
データよりヘッダの方がデカいという嫌な状況になってしまっているが、ファイルサイ
ズは最低 222 バイト。
> ところで、ヘッダ 36 バイトって根拠は何?
失礼、0x36 バイトですね。
sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) = 14 + 40 = 54 = 0x36
連投失礼。
BITMAPV4 / V5HEADER では、ヘッダは全部なくても良く、ヘッダサイズが適切に設定さ
れていれば、使わない後ろの方の要素は欠けていてもいいらしい。
よって、削るならば、ヘッダサイズは最低 56 バイト(BITMAPINFOHEADER 分 + ビット
マスク 4 つ分・BITMAPFILEHEADER 分を除く)でよい。
よって、最低ファイルサイズは 14 + 56 + 100 = 170 バイト。
ただし、より汎用的に表示させたいなら、削るべきではないと思われる(それを言った
ら、V4HEADER をちゃんと解釈するビューワがどれほどあるかも疑問になってしまう
が)。
詳細はこのへん参照のこと。
http://www.ruche-home.net/program/bmp/
> シャノンさん
ありがとうございます。
ヘッダのサイズは0x36で合ってるでしょうか?
BITMAPV4HEADERについては知りませんでした。
後ろが欠けていても平気とは便利ですね。
何から何まで教えてくださって感謝いたします。
無事画像をビューアで閲覧できるようになりました。
> ヘッダのサイズは0x36で合ってるでしょうか?
No.
最低でも、sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPV4HEADER のαマスク分ま
で ) = 14 + 56 = 70 = 0x46 バイトは必要です。
ですです、0x36バイトの間違いでした。
V4/V5ヘッダーといくつかあるのは知ってましたが、今回は読めないファイルを読めるよ
うにが前提だったので省きました。
(32bitBMPだとあんまり関係ないしね・・・)
ちなみに、私が言ってたパディングはファイルサイズの32bitパディングなので、
これも無くてもたいして影響はなかったかも?
表示できるようになったみたいなのでよかったです。