- 締切済み
プログラム(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字までなので構造体の宣言は抜いてしましました) 。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- yasuch
- ベストアンサー率41% (27/65)
>%03dと%dの違いはなんでしょうか? No.4さんの回答のとおりです。 この表示形式は目的により異なるので、空白を空けるなり カンマで区切るなり、自分の好きな形にしてみてください。 詳しくはprintfのヘルプか参考URLから『書式指定』を調べてみてください。
- JaritenCat
- ベストアンサー率37% (122/322)
>%03dと%dの違いはなんでしょうか? %03dだと整数を3桁で出力します。1桁や2桁の場合はあたまに0がつきます。 3桁未満のデータが混じる場合、たとえば「100 10 8」だと %d → 100108 になりデータを復元できません。 %03d → 100010008 ならデータは必ず3桁なのでデータ復元が可能です。
- yasuch
- ベストアンサー率41% (27/65)
なら、これでどうですか? 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); }
補足
できました。ありがとうございます。 あと質問なのですが %03dと%dの違いはなんでしょうか?
- yasuch
- ベストアンサー率41% (27/65)
こんな感じでいかがですか? 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); }
お礼
実行できました。 136136136199199199184184・・・・というように。でもこれを 136199184というように表示させたいのです><
補足
ありがとうございます。試してみますね☆
- JaritenCat
- ベストアンサー率37% (122/322)
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); }
補足
ありがとうございます。あと聞きたいことが出力なんですがうまくいきません。どうすればいいでしょうか? for文とprintfを使ったのですが・・・。
お礼
ありがとうございます。わかりやすい解答で。
補足
JaritenCatさんに聞きたいのですが。前に質問したヒルベルト走査と比べてbzip2を使って圧縮率を比較したのですが普通に走査(ラスタスキャン?)したほうが圧縮率がよっかたです。たいして差はなかったですが。。。なぜでしょうか? わたしが考えたのが数値で表すとヒルベルト走査の意味がなくなってしまい、数値でなく画素をヒルベルト走査すれば圧縮率がよくなると思ったのですが。