32bitビットマップファイルの作り方 – プログラミング – Home

32bitビットマップファイルの作り方
 
通知
すべてクリア

[解決済] 32bitビットマップファイルの作り方


閑古鳥
 閑古鳥
(@閑古鳥)
ゲスト
結合: 20年前
投稿: 9
Topic starter  

すみません。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

読みづらくてすみません。
手書きでバイナリエディタを使って作ってみたんですが、
(フルカラーのものに無理矢理アルファ情報入れただけですが)
描画できないとビューアに表示されてしまいました。
何ででしょうか?
教えてください。お願いします。


引用未解決
トピックタグ
憂
 憂
(@憂)
ゲスト
結合: 20年前
投稿: 72
 

提示された数値をちゃんとチェックしたわけではないのでわかりませんが、
これってビットマップファイルに必要なヘッダ情報は
ちゃんとファイルの先頭に入れてありますか?

独自に読み込む処理を作る場合はまた別の話になりますが、
一般のビューアやエディタで読み込みたい場合はそういった情報がないと
きちんと読み込めないのではないかと思います

もしビットマップファイルのフォーマットに関して知らないということなら、
まずその辺りから調べるといいと思います

もし的外れな場合は適当に聞き流してください(´・ω・`)


返信引用
ねこたま
 ねこたま
(@ねこたま)
ゲスト
結合: 19年前
投稿: 8
 

ヘッダは付いてるようですが、その内容が間違えていますね。
一つ目がファイルサイズの記述ミスです。
5×5の32bitであれば、データだけで0x00000064バイト
さらにヘッダー分(36バイト)足して0x0000009Aバイト
パディングが付くので0x0000009Cバイトが正しいサイズです。
どこにサイズが入るかはBMPのフォーマットを調べてください。

次にカラービット数がまちがえてます。
その記述だと50ビットカラーになってます。
32を16ビットで表記しなければいけないのでこの場合は0x20ですね。
これもどこに設定するかはフォーマットを調べればすぐわかります。

#BMPフォーマットのドキュメントはごろごろしてますのですぐ見つかると思います。
#BMPFILEHEADER,BMPINFOHEADERあたりで探せばすぐかも


返信引用
ねこたま
 ねこたま
(@ねこたま)
ゲスト
結合: 19年前
投稿: 8
 

訂正です。

誤)32を16ビットで表記しなければいけないのでこの場合は0x20ですね。
正)32を16進数で表記しなければいけないのでこの場合は0x20ですね。


返信引用
閑古鳥
 閑古鳥
(@閑古鳥)
ゲスト
結合: 20年前
投稿: 9
Topic starter  

> 憂さん
ご親切にありがとうございます。
ヘッダ情報が変だったみたいですね。
すみません。

> ねこたまさん
わざわざ解読してくださってすみませんでした。
32を16進法に直すことには全く気づきませんでした。

でもパディングの分は各行末に含まれてるらしいので
0x0000009Cじゃなくて0x0000009F(辺り)じゃないのですか?
ファイルサイズの計算がいまひとつピンときません。
バイナリエディタの終点までのアドレスじゃだめなんですか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

32bpp なら、パディングはつかないんじゃない?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

ところで、ヘッダ 36 バイトって根拠は何?
ちなみに、厳密には BITMAPINFOHEADER ではアルファチャンネルは使えないので、
BITMAPV4HEADER を使わなければなりません。
よって、ヘッダサイズは最低でも 122 バイト。
データよりヘッダの方がデカいという嫌な状況になってしまっているが、ファイルサイ
ズは最低 222 バイト。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> ところで、ヘッダ 36 バイトって根拠は何?

失礼、0x36 バイトですね。
sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) = 14 + 40 = 54 = 0x36


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

連投失礼。
BITMAPV4 / V5HEADER では、ヘッダは全部なくても良く、ヘッダサイズが適切に設定さ
れていれば、使わない後ろの方の要素は欠けていてもいいらしい。
よって、削るならば、ヘッダサイズは最低 56 バイト(BITMAPINFOHEADER 分 + ビット
マスク 4 つ分・BITMAPFILEHEADER 分を除く)でよい。
よって、最低ファイルサイズは 14 + 56 + 100 = 170 バイト。
ただし、より汎用的に表示させたいなら、削るべきではないと思われる(それを言った
ら、V4HEADER をちゃんと解釈するビューワがどれほどあるかも疑問になってしまう
が)。

詳細はこのへん参照のこと。
http://www.ruche-home.net/program/bmp/


返信引用
閑古鳥
 閑古鳥
(@閑古鳥)
ゲスト
結合: 20年前
投稿: 9
Topic starter  

> シャノンさん
ありがとうございます。
ヘッダのサイズは0x36で合ってるでしょうか?
BITMAPV4HEADERについては知りませんでした。
後ろが欠けていても平気とは便利ですね。
何から何まで教えてくださって感謝いたします。
無事画像をビューアで閲覧できるようになりました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> ヘッダのサイズは0x36で合ってるでしょうか?

No.
最低でも、sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPV4HEADER のαマスク分ま
で ) = 14 + 56 = 70 = 0x46 バイトは必要です。


返信引用
ねこたま
 ねこたま
(@ねこたま)
ゲスト
結合: 19年前
投稿: 8
 

ですです、0x36バイトの間違いでした。
V4/V5ヘッダーといくつかあるのは知ってましたが、今回は読めないファイルを読めるよ
うにが前提だったので省きました。
(32bitBMPだとあんまり関係ないしね・・・)
ちなみに、私が言ってたパディングはファイルサイズの32bitパディングなので、
これも無くてもたいして影響はなかったかも?

表示できるようになったみたいなのでよかったです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました