- ベストアンサー
ビットマップ画像を読み込むプログラムがうまく行かない!困ってます
- ビットマップ画像を読み込むプログラムがうまく行かない
- 画像の表示と輝度値の表示を行うプログラムがうまく動作しない
- 作成したプログラムに3つの問題が発生している
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ビットマップファイルにはビット深度が24ビット未満の場合 このファイルで使用されるパレットが登録されています BITMAPINFOHEADER と 実際のビットイメージの間に RGBA*何色といったパレットが存在します グレースケールの8bitなら256個です 何個あるかは BITMAPINFOHEADERのbiClrUsedがそれに当ります これが0ならbiBitCountをビットシフトして求めます 1 << biBitCountが個数になります 実際のバイトデータとしては (1 << biBitCount) * sizeof(RGBQ) バイト存在します したがって BYTE* pPalette = (BYTE*)calloc( sizeof(RGBQ), (1 << biBitCount) ); とバッファを宣言して fread(&bmih,sizeof(bmih),1,fp); の後で fread( pPalette, sizeof(RGBQ), (1 << biBitCount), fp ); を実行してから 色情報を取得しましょう 書き出すときも同じように fwrite(&bmih,sizeof(bmih),1,fp); の後で fwrite( pPalette, sizeof(RGBQ), (1 << biBitCount), fp ); を実行します あと動的に確保したバッファは使い終わったら free()で開放しましょう return 0;の前に free( pPalette ); for(i = 0; i < Y_SIZE; i++){ for(j = 0; j < X_SIZE; j++){ free(mae[i][j]); } } for(i = 0; i < Y_SIZE; i++){ free(mae[i]); } free(mae); といった具合に 逆順に開放していきます
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >しかし、このプログラムは、他人のプログラムに改良を加えて作成したものです。 >なので、このプログラム自体、私自身が完璧に理解できていない状況です。 ↑ それなら回答者は誰一人理解できないんでしょうね。多分。 ・質問文を読んで思ったのですがグレイスケールのビットマップ画像は 256 色の パレット・テーブルは持っているのですか? パレット・テーブルはなさそうですよね。 だから >c)出力した画像が、”ディスクエラー”によりPhotoshopで開けない。 > (ペイントでは開ける) ↑ となる気がします。 確かビットマップ画像で 256 色以下は必ずパレット情報を持つ必要があるはずですので 『Photoshop』ではディスクエラー(BMP形式でないエラー)となるのだと思います。 ペイントではなぜ開けるのだろ? あまり厳しくヘッダをチェックしていないのかも? ・用意したグレースケールのビットマップ画像が正しいと保障できますか? きちんとビットマップのヘッダを確認した方が良いですよ。 縦横ピクセル数、カラー数、その他いろいろ。 ・あと次の構造体をちゃんと理解して下さい。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/bitmapinfoheaderstructure.asp パレット・テーブルの RGBQUAD 構造体をちゃんと読み書きすること。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_DIB.html ・以上。
お礼
返信が遅くなってしまい、申し訳ありません。 ご意見ありがとうございました。大変参考になりました。 教えて頂いたHPを拝見したところ、私には難しいようでした…。 もう少し勉強をする必要がありそうです。 また疑問が湧いたら、質問をさせて頂きます。 その際はよろしくお願い致します。
お礼
返信が大変遅くなってしまいました。申し訳ないです。 redfox63さんのアドバイスを基に改良を加えたところ、 無事にグレースケールのBMP画像を読み込むことができました。 ご意見を頂けて、大変感謝をしております。 ありがとうございました。 まだまだ知識不足ですので、また質問をすることがあると思います。 その際は、よろしくお願い致します。