• 締切済み

C言語でbmp モノクロ画像の画像処理を行い、x・y・1or0 をtx

C言語でbmp モノクロ画像の画像処理を行い、x・y・1or0 をtxtファイルに出力するプログラムを作らないといけないのですが、下記のプログラムのどこをいじればいいかわかりませんだれかお分かりになりませんか? #include <stdio.h> #include <process.h> #define COEF 0.1; #define X_CHORD_Max 512 #define Y_CHORD_Max 512 unsigned long *readBmp(char *filename); main() { unsigned long *pBmp; char input[64], output[64]; int x, y, k,n; char temp; float xCodnt,yCodnt; unsigned long hight, wight; unsigned int maskBit = 0x0080; /* Record the data*/ printf("Input file.bmp :"); scanf("%s", input); printf("output file.txt :"); scanf("%s", output); FILE *fpTxt; if((fpTxt=fopen(output,"wt"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } pBmp = readBmp(input); /* Read the Data*/ hight = *(pBmp+1); wight = *pBmp/32; pBmp += 2; for (y=0;y<hight; y++) { for (x=0; x<wight; x++) { for (k=0; k<4; k++) { temp =(char)*pBmp; for (n=0; n<8; n++) { if(temp & maskBit) { xCodnt = COEF; yCodnt =COEF; xCodnt = xCodnt*(x*32+k*8+n); yCodnt = yCodnt*y; fprintf(fpTxt,"G01 X%f Y%f\n",xCodnt,yCodnt); } maskBit >>= 1; } *pBmp >>= 8; maskBit = 0x0080; } pBmp ++; } } rewind(fpTxt); fclose(fpTxt); //END

みんなの回答

回答No.3

readBmpの出力が32ビット毎に区切られた1bitモノクロ画像なら、ANo.2の人の回答で基本的には良いと思いますが、(temp & maskBit)の評価結果が真の時の値が1かどうかは処理系に依存するので、次のような形にする方が確実かと思います。 fprintf(fpTxt,"%d・%d・%d\n",(x*32+k*8+n),y,((temp & maskBit)? 1 : 0)); ・おまけ (以下、readBmpのソースを見て気になったところ) > if ((biWidth > X_CHORD_Max)||(biHeight > Y_CHORD_Max)) biWidth,biHeightはピクセル数を表していますので、1bit画像なら基本的にはイメージデータのビット数を示します。一方、X_CHORD_Max, Y_CHORD_Maxはunsigned longを単位とした読み込みバッファのサイズを示しているので、スケールの違う値を比較してることになります。 ま、バッファサイズが十分に大きければ問題は無いのですが、実際の画像の最大32倍のサイズが必要ということになってしまいます。 > for(i = 2; i < (biSizeImage * 8 + 2); i++) > { > fread(&image[i], 4, 1, fp); > } biSizeImageは画像イメージのバイト数を示します。それを8倍した回数、4バイトずつ読み込むというのは、画像に対して読み込み回数が多過ぎます。(4バイトずつじゃなく1ビットずつ読み込むとかいうのなら、この回数で正しいのですが) これだと、早々にfreadはEOFに達してエラー(0)を返すことになりますが、その対応もありません。ま、そのままfreadを続けても該当するバッファ領域にゴミが入る(残る)だけですが…… 4バイトずつ読み込むのなら読み込み回数は(biSizeImage / 4)で良いはずです。(biSizeImageが4の倍数の場合) この辺りは32bit画像の読み込み処理を流用してそのままになってるっぽい感じですが。

すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

readBmpの仕様次第ですがとりあえず if(temp & maskBit) { xCodnt = COEF; yCodnt =COEF; xCodnt = xCodnt*(x*32+k*8+n); yCodnt = yCodnt*y; fprintf(fpTxt,"G01 X%f Y%f\n",xCodnt,yCodnt); } を fprintf(fpTxt,"%d・%d・%d\n",(x*32+k*8+n),y,(temp & maskBit));

すると、全ての回答が全文表示されます。
回答No.1

処理内容が不明確です。 (1)モノクロ画像を入力してその情報を書きだすのか? (2)カラー画像を入力し、モノクロに変換してその情報を書きだすのか? (2)の場合はモノクロ変換の条件が必要です。 (ま、輝度成分で単純二値化するのがオーソドックスだろうけど) readBmp関数を使うならreadBmp関数の仕様が提示されていないと不親切。ま、先頭の32bitに横幅のビット数、次の32bitに高さ、それに続くのが32bitの画素情報ってとこだろうけど、画素情報のフォーマットが不明確。単純に考えたらARGBまたはRGBの32bitフォーマットでしょうけど。 そもそも上のコードが何を目的にしたコードなのか…… 自分ならBitmapファイルの読み込みから全部自作するところですが……

kaizokukoko
質問者

補足

 不明確で申し訳ありません system("PAUSE"); return 0; } unsigned long *readBmp(char *filename) { unsigned short bfType, biBitCount; unsigned long bfSize,biSizeImage,biWidth,biHeight; FILE *fp; unsigned long data; static unsigned long image[Y_CHORD_Max * X_CHORD_Max + 2]; int i; unsigned long *pointer; if ((fp = fopen(filename, "rb"))==NULL) { printf("readBmp: Open error!\n"); getch(); exit(1); } /*The head part of BMP file*/ fread(&bfType, 2, 1, fp);/*Type*/ fseek(fp,16L,SEEK_CUR); fread(&biWidth, 4, 1, fp);/* Width*/ fread(&biHeight, 4, 1, fp);/*Height*/ fseek(fp,2L,SEEK_CUR); fread(&biBitCount, 2, 1, fp);/**/ fseek(fp,4L,SEEK_CUR); fread(&biSizeImage, 4, 1, fp);/**/ fseek(fp,24L,SEEK_CUR); /**/ if (bfType != 0x4d42) { printf("Not an available .BMP file\n"); fclose(fp); getch(); exit(1); } if (biBitCount != 0x01) { printf("Not an available Monochrome Bitmap file\n"); fclose(fp); getch(); exit(1); } if ((biWidth > X_CHORD_Max)||(biHeight > Y_CHORD_Max)) { printf("Out of range\n"); fclose(fp); getch(); exit(1); } image[0] = biSizeImage * 8 / biHeight; image[1] = biHeight; for(i = 2; i < (biSizeImage * 8 + 2); i++) { fread(&image[i], 4, 1, fp); } rewind(fp); fclose(fp); pointer = &image[0]; return(pointer); } こちらの読み込み部分が欠如したまま質問を行っていました もうしわけありません あと32bitで処理を行うのではなく8bitで行いたいと考えてます

すると、全ての回答が全文表示されます。

関連するQ&A