• 締切済み

プログラム(C)

#include <stdio.h> #include <stdlib.h> #define FNAME "smp.bmp" #define WSIZE 256 #define HSIZE 256 #define BSIZE 1024 int main(void) { struct BMPFILEHEADER { ・   ・ }; struct BMPINFOHEADER { ・   ・ }; unsigned char img[HSIZE][WSIZE][3]; unsigned char buf[BSIZE]; struct BMPFILEHEADER lpHead; struct BMPINFOHEADER lpInfo; FILE *fp; int i; int j; int k; fp = fopen(FNAME,"rb"); if (fp==NULL) { printf("ファイルをオープンできません\n"); return 0; } fread(&lpHead.bfType, sizeof(unsigned short),1,fp); fread(&lpHead.bfSize, sizeof(unsigned int),1,fp); fread(&lpHead.bfReserved1, sizeof(unsigned short),1,fp); fread(&lpHead.bfReserved2, sizeof(unsigned short),1,fp); fread(&lpHead.bf0ffBits, sizeof(unsigned int),1,fp); fread(&lpInfo, sizeof(struct BMPINFOHEADER),1,fp); for(i=0;i<HSIZE;i++) { fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; } } } fclose; return 0; } このプログラムはBMP画像を読み込むプログラムなんですが このプログラムに画素値を出力するプログラムにしたいのですがうまくできません。 結果は(真っ白な画像の時)255255255・・・255255と出力したいのです。白黒画像なのでR=G=Bで1画素値は255だけでいいのですが。どうしても255255255や25500などとでてしまいます。 アドバイスお願いします。(800字までなので構造体の宣言は抜いてしましました) 。

みんなの回答

  • yasuch
  • ベストアンサー率41% (27/65)
回答No.5

>%03dと%dの違いはなんでしょうか? No.4さんの回答のとおりです。 この表示形式は目的により異なるので、空白を空けるなり カンマで区切るなり、自分の好きな形にしてみてください。 詳しくはprintfのヘルプか参考URLから『書式指定』を調べてみてください。

参考URL:
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_crt_printf.2c_.wprintf.asp
回答No.4

>%03dと%dの違いはなんでしょうか? %03dだと整数を3桁で出力します。1桁や2桁の場合はあたまに0がつきます。 3桁未満のデータが混じる場合、たとえば「100 10 8」だと %d → 100108 になりデータを復元できません。 %03d → 100010008 ならデータは必ず3桁なのでデータ復元が可能です。

gfgdhggddg
質問者

お礼

ありがとうございます。わかりやすい解答で。

gfgdhggddg
質問者

補足

JaritenCatさんに聞きたいのですが。前に質問したヒルベルト走査と比べてbzip2を使って圧縮率を比較したのですが普通に走査(ラスタスキャン?)したほうが圧縮率がよっかたです。たいして差はなかったですが。。。なぜでしょうか? わたしが考えたのが数値で表すとヒルベルト走査の意味がなくなってしまい、数値でなく画素をヒルベルト走査すれば圧縮率がよくなると思ったのですが。

  • yasuch
  • ベストアンサー率41% (27/65)
回答No.3

なら、これでどうですか? fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; } printf("%03d", buf[j*3]); } printf("\n"); /* ダミーデータ読み捨て */ if (WSIZE%4 != 0) { fread(buf,sizeof(unsigned char),WSIZE%4,fp); }

gfgdhggddg
質問者

補足

できました。ありがとうございます。 あと質問なのですが %03dと%dの違いはなんでしょうか?

  • yasuch
  • ベストアンサー率41% (27/65)
回答No.2

こんな感じでいかがですか? fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; printf("%03d", buf[j*3+k]); } } printf("\n"); /* ダミーデータ読み捨て */ if (WSIZE%4 != 0) { fread(buf,sizeof(unsigned char),WSIZE%4,fp); }

gfgdhggddg
質問者

お礼

実行できました。 136136136199199199184184・・・・というように。でもこれを 136199184というように表示させたいのです><

gfgdhggddg
質問者

補足

ありがとうございます。試してみますね☆

回答No.1

BMPファイルの画像データ部分は、横幅が4の倍数になるようにダミーデータが入ります。値は大抵0です。このダミーデータのことを言っているのでしょうか。 そうであれば、ダミーデータを読み捨てればいいと思いますが。。 fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; } } /* ダミーデータ読み捨て */ if (WSIZE%4 != 0) { fread(buf,sizeof(unsigned char),WSIZE%4,fp); }

gfgdhggddg
質問者

補足

ありがとうございます。あと聞きたいことが出力なんですがうまくいきません。どうすればいいでしょうか? for文とprintfを使ったのですが・・・。

関連するQ&A