• ベストアンサー

ビットマップファイル生成(C言語)

64個の整数(ピクセルの色データ)をファイルin.txtから読み込み、8×8のサイズのビットマップファイルout.bmpを生成するプログラムを作っていますが、なんだか良くわかりません。 64個の整数をすべて256にすれば青になると言われたのですが、黒になってしまいます。 一応ビルドと実行はできました。 自分で作ったソースは↓です http://www.geocities.jp/c_prog2011/file_2.txt 一応問題文は↓です http://www.geocities.jp/c_prog2011/bitmap_1.txt よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.4

質問者のソースをいじって、ファイルからではなく直接値を入力して 8×8のデータを作ってみました。 後はファイルから読み込むのは自分でやってください。 簡単ですから・・・ ちなみに質問が青にしたかったみたいなので青一色です。 それとヘッダで指定ビットを32に変更しました。 課題が4バイトと指定があったので。 #include <stdio.h> #include <stdlib.h> #define HEIGHT 8 #define WIDTH 8 #define COLOR_R (0x00FF0000) //赤 #define COLOR_G (0x0000FF00) //緑 #define COLOR_B (0x000000FF) //青 int main(void) { FILE *bmp; int i; unsigned int bitmap[64]; unsigned char bmpHeader[54] = { 'B', 'M', /* [ 0] ファイルタイプ */ 246, 0, 0, 0, /* [ 2] ファイルサイズ */ 0, 0, 0, 0, /* [ 6] 予約 */ 54, 0, 0, 0, /* [10] ビットマップデータのシーク位置 */ 40, 0, 0, 0, /* [14] ここから始まるヘッダの高さ */ 8, 0, 0, 0, /* [18] ビットマップの幅 */ 8, 0, 0, 0, /* [22] ビットマップの高さ */ 0x01, 1, /* [26] プレーン数 */ 32, 0, /* [28] 1ピクセルあたりのビット数 (課題が4バイト指定されていたので32bitに変更) */ 0, 0, 0, 0, /* [30] 圧縮タイプ */ 192, 0, 0, 0, /* [34] ビットマップデータの長さ */ 0x20, 0x2e, 0, 0, /* [38] 水平解像度(px/m) */ 0x20, 0x2e, 0, 0, /* [42] 垂直解像度(px/m) */ 0, 0, 0, 0, /* [46] カラーインデックス数 */ 0, 0, 0, 0, /* [50] 重要なカラーインデックス数 */ }; bmp = fopen("out.bmp", "wb"); if(bmp == NULL) { printf("入力ファイルがオープンできません\n"); exit(1); } //直接色の値入力 for(i=0; i<64; i++) bitmap[i]=COLOR_B; //一応お約束 fseek(bmp, 0L, SEEK_SET); fwrite(bmpHeader, 1, 54, bmp); fwrite(bitmap, 4, 64, bmp); //ファイル閉じましょうね! fclose(bmp); return 0; } 必要なところ以外はいじっていませんが、 あとはご自分でどうぞ!

cermet
質問者

お礼

ご回答ありがとうございます。 何とか完成させることができました。

その他の回答 (4)

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.5

unsigned char bitmap[64]; unsigned char bmpHeader[54] = { 'B', 'M', /* [ 0] ファイルタイプ */ 246, 0, 0, 0, /* [ 2] ファイルサイズ */ 192, 0, 0, 0, /* [34] ビットマップデータの長さ */ この数値ですが、 64*4+54=310 310-54=256 なので、 54, 1, 0, 0, と 0, 1, 0, 0, でしょうか?

cermet
質問者

お礼

そこは先生があらかじめ決めていたものなので良くわかりません・・・

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.3

ざっとソースを見ましたが、ヘッダ以外は値を書き込んでいないので 結果が伴わないを当然です。 unsigned char bitmap[64]; 1ピクセル4バイトのなのでこれじゃバッファが足りませんよ。 それとテキストデータに値を書いて、その値をそのまま代入しても、 データとしては意図した値になりませんが、それは大丈夫ですか? 仮にテキストに255と書いても、バイナリにすれば0x32 0x35 0x35です。 代入するときに変換しないといけませんよ。 まず試しに8×8のBMPをグラフィックツールで作ってみて、 バイナリエディタで値を見てみると一目瞭然です。 ついでにいえばヘッダは構造体にした方がわかりやすいです。

cermet
質問者

お礼

ご回答ありがとうございます。 変換のことはなにも言われていないのでよくわかりません・・・

  • Kyo99
  • ベストアンサー率12% (1/8)
回答No.2

ソースを見たのですが"out.bmp"にbitmap配列を書き出していないのではないでしょうか。(多分作成された"out.bmp"にはbmpHeaderしか含まれていないため、ピクセルの色データがすべて0と解釈され真っ黒になってるんだと思います。)

cermet
質問者

お礼

ご回答ありがとうございます。 何とか完成させることができました。

  • daivin
  • ベストアンサー率40% (2/5)
回答No.1

1バイトは0から255なので256ではなく255にしてみてはいかかでしょうか。 RGBの処理をどのようにされているかは分かりませんが256であれば、 B:255 G:1 R:0 という色のbmpが出力すると考えられます。

cermet
質問者

お礼

ご回答ありがとうございます。 たしかに先生に言われたのは255でした。

関連するQ&A