• 締切済み

BMPファイルへの書き込みができない

このプログラムは、左半分を黒、右半分を白の画像をBMPファイルに出力しようとしています。(出来ていません) プログラムの下に質問書いてます!お願いします! #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char *filename; int x; int y; int width; int height; unsigned char data[80][100]; } BMP_DATA; static void WriteBmp(char *filename, BMP_DATA Image) { unsigned long Bmp_size;/*BMPファイルのサイズ*/ unsigned int Bmp_info_header_size;/*情報ヘッダのサイズ*/ unsigned int Bmp_header_size;/*ヘッダのサイズ*/ long Bmp_width;/*幅*/ long Bmp_height;/*高さ*/ unsigned short Bmp_planes;/*プレーン数*/ unsigned short Bmp_color;/*色 = 1[bit] (黒か白かだけ)*/ long Bmp_image_size;/*画像部分のサイズ*/ long Bmp_xppm;/*水平解像度*/ long Bmp_yppm;/*垂直解像度*/ int i,j; unsigned char Bmp_headbuf[54]; /*ヘッダ*/ unsigned char Bmp_Data[13]; FILE *Out = fopen(filename, "wb"); if(Out==NULL){ fclose(Out); exit(1); } /* ヘッダ情報の準備 */ Bmp_info_header_size = 40; Bmp_header_size = 54; Bmp_planes = 1; Bmp_color = 1; Bmp_image_size = Image.height * Image.width; Bmp_xppm = 0; Bmp_yppm = 0; Bmp_size = Bmp_image_size + Bmp_header_size; Bmp_headbuf[0] = 'B'; Bmp_headbuf[1] = 'M'; memcpy(Bmp_headbuf+2, &Bmp_size, sizeof(Bmp_size)); Bmp_headbuf[6] = 0; Bmp_headbuf[7] = 0; Bmp_headbuf[8] = 0; Bmp_headbuf[9] = 0; memcpy(Bmp_headbuf+10, &Bmp_header_size, sizeof(Bmp_header_size)); Bmp_headbuf[11] = 0; Bmp_headbuf[12] = 0; Bmp_headbuf[13] = 0; memcpy(Bmp_headbuf+14, &Bmp_info_header_size, sizeof(Bmp_info_header_size)); Bmp_headbuf[15] = 0; Bmp_headbuf[16] = 0; Bmp_headbuf[17] = 0; memcpy(Bmp_headbuf+18, &Image.width, sizeof(Bmp_width)); memcpy(Bmp_headbuf+22, &Image.height, sizeof(Bmp_height)); memcpy(Bmp_headbuf+26, &Bmp_planes, sizeof(Bmp_planes)); memcpy(Bmp_headbuf+28, &Bmp_color, sizeof(Bmp_color)); memcpy(Bmp_headbuf+34, &Bmp_image_size, sizeof(Bmp_image_size)); memcpy(Bmp_headbuf+38, &Bmp_xppm, sizeof(Bmp_xppm)); memcpy(Bmp_headbuf+42, &Bmp_yppm, sizeof(Bmp_yppm)); Bmp_headbuf[46] = 0; Bmp_headbuf[47] = 0; Bmp_headbuf[48] = 0; Bmp_headbuf[49] = 0; Bmp_headbuf[50] = 0; Bmp_headbuf[51] = 0; Bmp_headbuf[52] = 0; Bmp_headbuf[53] = 0; /* ヘッダ情報書き出し */ fwrite(Bmp_headbuf, sizeof(unsigned char), Bmp_header_size, Out); /* 画像データ書き出し */ for(i=0;i<13;i++) Bmp_Data[i] = 0; for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ int index = j/8; if(j%8 == 0){ Bmp_Data[index] = Image.data[i][j ] * 128 + Image.data[i][j+1] * 64 + Image.data[i][j+2] * 32 + Image.data[i][j+3] * 16 + Image.data[i][j+4] * 8 + Image.data[i][j+5] * 4 + Image.data[i][j+6] * 2 + Image.data[i][j+7]; } } Bmp_Data[12] = (Bmp_Data[12] & 0xf0); fwrite(Bmp_Data, sizeof(unsigned char), 20, Out); /* ○ */ } fclose(Out); } int main() { BMP_DATA Image; int line = 0; int i,j; Image.x = 0; Image.y = 0; Image.width = 100; Image.height = 80; if(line == 0){ for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ Image.data[i][j] = 1; } } } while(1){ /* BMPファイルデータを編集 */ for(j=0; j<Image.width; j++){ if(j < 50){ Image.data[line][j] = 0;//black }else{ Image.data[line][j] = 1;//white } } /* すべての列を編集したら、再描画する */ if(line == 63){ /* BMPファイルに書込む */ WriteBmp("display.bmp", Image); break; } line++; } return 0; } 以下の条件で、BMPファイルへ書き込もうとしています ・色の深さ1(黒か白) ・画像のピクセルサイズ(横100×縦80) fwrite関数で1列ずつ書き込もうとしているのですが、 この関数は1バイトずつしか書き込めないみたいで、100ビット書き込もうと思うと、 最低でも104ビット書き込まなくてはならない状況になります。 まず、この4ビットはどう処理すればいいのでしょうか?? あと、display.bmpのファイルがある状態で、プログラムを実行するとちゃんと動くのですが、 プログラム中の○のところのfwrite関数の第三引数を13にすると、BMPファイルが壊れて閲覧できなくなります。(ある程度大きい数字だと、BMPファイルは壊れないのですが、ぐちゃぐちゃの絵になります) その理由もわかりません。 汚い文章&プログラムですが よろしくお願いします><

みんなの回答

noname#208507
noname#208507
回答No.1

> まず、この4ビットはどう処理すればいいのでしょうか?? 余分なデータには 0 を入れます。 Windows BMPは横1行のデータ長が4バイトの倍数でなければいけません。なのでビットマップデータの配列は13バイトではなく unsigned char Bmp_Data[16]; が必要です。そのため > ある程度大きい数字だと、BMPファイルは壊れない ことになります。実際には16バイト書きこむ必要があります。 fwrite(Bmp_Data, sizeof(unsigned char), 16, Out); またモノクロのビットマップの場合、カラーパレットが必要です。 「ヘッダ情報書き出し」の後、「画像データ書き出し」の前に unsigned char black[4] = { 0, 0, 0, 0 }; unsigned char white[4] = { 255, 255, 255, 0 }; fwrite(black, sizeof(unsigned char), 4, Out); fwrite(white, sizeof(unsigned char), 4, Out); のような処理を追加する必要があります。 bmpは下から上に向かって記録するので、高さ方向のループが逆です。 for(i=Image->height-1; i>=0; i--){ ヘッダ情報は30バイト目に何も書き込んでいませんが、この場合はスタック領域にBmp_headbufが置かれるので不定の値が入ってしまいます。下のように初期化しておくか、きちんと値を書き込んだ方がよいです。 memset(Bmp_headbuf, 0, sizeof(Bmp_headbuf)); あと if(line == 63){ は if(line == 79){ の間違いでしょうか?

関連するQ&A

  • raw形式からbmp形式への書き込み (画像処理)

    今、raw形式のファイルを読み込んで、bmp形式への書き込みを 行うプログラムを作成しているのですがうまくいきません. 作成したプログラムの一部は以下のようになっています. ------------------rawファイルを読み込む関数の一部------------- //1次元配列の確保 tmp=us_Calloc2(width,height); //画像の読み込み fread(tmp,sizeof(unsigned short),width*height,fp); //2次元配列の確保 img->data=us_Calloc1(width,height); //1次元配列から2次元配列にデータを移動する for(i=0; i<height; i++){ for(j=0; j<width; j++){ img->data[i][j]=tmp[(width*i)+j]; } } ------------------------------------------------------------ --------------bmpファイルに書きこむ(一部)-------------- //bufのメモリ領域の確保 buf=us_Calloc2(width,height); for(i=0; i<height; i++){ for(j=0; j<width; j++){ buf[(width*i)+j]=img->data[i][j]; } } //BMPのファイルヘッダーの出力(省略) //BMPの情報ヘッダーの出力(省略) //画像データの出力 if(fwrite(buf,sizeof(unsigned short),size,fp)!=size){ printf("画像をBMPに書き込むことができませんでした.\n"); free(buf); fclose(fp); exit(-1); } } このように書いたのですが、うまくBMPファイルに出力できません. アドバイスよろしくお願いします.

  • C言語による間引き拡大縮小

    http://csharpimage.blog60.fc2.com/blog-entry-18.html をみて、単純間引きによる拡大縮小を C言語風に書こうとしているのですが、 rescale[i+j] =layer[(int)xpos+(int)ypos];部分がよくわかりません。 24bppのRawファイル(RGB)を拡大縮小しようとしています。 rescale[i+j] =layer[(int)xpos+(int)ypos];の layer[(int)xpos+(int)ypos];部分をどうしたらいいのか悩んでいます。 layer:24bppRawを読み込むメモリ アドバイスお願い致します。m(___)m FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; // 拡大縮小後の画像サイズ int hxSize=Common_Data_Raw->width_rescale; int hySize=Common_Data_Raw->height_rescale; // 拡大縮小用 int xSize=width; int ySize=height; double xpos, ypos; double hokanX = (double)xSize / hxSize; double hokanY = (double)ySize / hySize; unsigned char *layer,*rescale; //読み込み layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); //拡大縮小後のサイズ rescale=(unsigned char*)malloc(3*hxSize*hySize*sizeof(unsigned char)); ypos = 0.0; for (int i = 0; i < 3*hxSize*hySize; i+= 3*hxSize) { xpos = 0.0; for (int j=0;j<3*hxSize;j+=3) { // 単純補間・間引き rescale[i+j] =layer[(int)xpos+(int)ypos]; rescale[i+j+1]=layer[(int)xpos, (int)ypos]; rescale[i+j+2]=layer[(int)xpos, (int)ypos]; xpos += hokanX; } ypos += hokanY; } _wfopen_s(&fpt_output,L"output.raw",L"wb"); fwrite(&rescale[0],sizeof(unsigned char),3*width*height,fpt_output); fclose(fpt); fclose(fpt_output); free(layer); free(rescale); return 0;

  • RGB→YUV変換のプログラム

    RGB→YUV変換を行っているのですが、 うまくいきません。 以下であっているのでしょうか? //RGB > YUV変換 void RGBtoYUV(char *filename,int width,int height) { FILE *fpt,*fpt_output; unsigned char *Input,*head; unsigned char Y=0,U=0,V=0; int i,j,b_flag=1; int modification=0; modification=width%4; //ファイルのオープン fopen_s(&fpt,filename,"rb"); if(fpt==NULL) { char DebugStr[256]; wsprintf(DebugStr,"%sが存在しません",filename); MessageBox(NULL,DebugStr,"File Error",MB_OK); } else { fopen_s(&fpt_output,"YUV.bmp","wb"); //ヘッダ情報の書き込み head=(unsigned char*)malloc(54); fread(head,sizeof(unsigned char),54,fpt); fwrite(head,sizeof(unsigned char),54,fpt_output); free(head); Input=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //メモリに展開 for(i=0;i<height;i++) { fread(&Input[i*(3*width)],sizeof(unsigned char),3*width,fpt); fseek(fpt,modification,SEEK_CUR); } fclose(fpt);//Inputファイルのクローズ for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { Y=(unsigned char)(0.299*Input[i+j+2]+0.587*Input[i+j+1]+0.114*Input[i+j]); U=(unsigned char)(-0.169*Input[i+j+2]-0.3316*Input[i+j+1]+0.500*Input[i+j]); V=(unsigned char)(0.500*Input[i+j+2]-0.4186*Input[i+j+1]-0.0813*Input[i+j]); //Y if(Y<0) { Input[i+j]=0x00; } else if(Y>255) { Input[i+j]=0xff; } else { Input[i+j]=Y; } //U if(U<0) { Input[i+j+1]=0x00; } else if(U>255) { Input[i+j+1]=0xff; } else { Input[i+j+1]=U; } //V if(V<0) { Input[i+j+2]=0x00; } else if(V>255) { Input[i+j+2]=0xff; } else { Input[i+j+2]=V; } } }//i fseek(fpt_output,54,SEEK_SET); for(i=0;i<height;i++) { fwrite(&Input[3*width*i],sizeof(unsigned char),3*width,fpt_output); //修正値の代入 for(j=0;j<modification;j++) { fwrite("\x000",sizeof(unsigned char),1,fpt_output); } } fclose(fpt_output); free(Input); } } 又 YUV→RGBにすると元の画像に戻らずに困っています。 プログラムに対するご指摘お願いします。 このプログラムはWindowGUIで幅と高さとファイル名を入力して 走らせるプログラムです。24bpp BMPが対象です。

  • RGBをCMYKに変換するプログラム

    Windows7 VS2008 SP1 RGBからCMYKに変換するプログラムを以下の様に書いている ([詳解]画像処理プログラミング という本に載っている ソースです) のですがうまくいきません。 おそらく型の扱い??だと思うのですが・・ 具体的にどの部分を修正すればいいのかご指摘お願いします。 INPUT:24bpp raw int RawToCMYK(WCHAR *filename,int width,int height) { FILE *fpt; FILE *fpt_C,*fpt_M,*fpt_Y,*fpt_K; unsigned char *layer; unsigned char *C,*M,*Y,*K; int i,j; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"RawToCMYK Error",L"RawToCMYK Error",MB_OK); return -1; } else { layer=(unsigned char*)malloc(3*width*height); C=(unsigned char *)malloc(width*height); M=(unsigned char *)malloc(width*height); Y=(unsigned char *)malloc(width*height); K=(unsigned char *)malloc(width*height); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); fclose(fpt); _wfopen_s(&fpt_C,L"RawToC.raw",L"wb"); _wfopen_s(&fpt_M,L"RawToM.raw",L"wb"); _wfopen_s(&fpt_Y,L"RawToY.raw",L"wb"); _wfopen_s(&fpt_K,L"RawToK.raw",L"wb"); for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { C[i/3+j/3]=255-layer[i+j]; M[i/3+j/3]=255-layer[i+j+1]; Y[i/3+j/3]=255-layer[i+j+2]; K[i/3+j/3]=min3(C[i/3+j/3],M[i/3+j/3],Y[i/3+j/3]); if(K[i/3+j/3]==0xff) { C[i/3+j/3]=0x00; M[i/3+j/3]=0x00; Y[i/3+j/3]=0x00; } else { C[i/3+j/3]=(C[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); M[i/3+j/3]=(M[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); Y[i/3+j/3]=(Y[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); } } } fwrite(&C[0],sizeof(unsigned char),width*height,fpt_C); fwrite(&M[0],sizeof(unsigned char),width*height,fpt_M); fwrite(&Y[0],sizeof(unsigned char),width*height,fpt_Y); fwrite(&K[0],sizeof(unsigned char),width*height,fpt_K); fclose(fpt_C); fclose(fpt_M); fclose(fpt_Y); fclose(fpt_K); free(C); free(M); free(Y); free(K); return 0;

  • c言語でソーベルフィルタが作りたい

    c言語で画像処理のソーベルのフィルタが作りたいのですが、どうにもうまく動きません。おかしい点をご指摘していただけないでしょうか。一次元配列で作りたいです。 /*wiは読み込んだ画素値、woは書き出す画素値、m1,m2はフィルタ係数、widthは画像の幅、heightは画像の高さ*/ void sobel(unsigned char wi[], unsigned char wo[], char m1[],char m2[],int width, int height){ int i,j,k,l,z; unsigned char *w; unsigned char *wo2; w = (char*)malloc(sizeof(char)*(MW*MH)); wo2 = (char*)malloc(sizeof(char)*(MW*MH)); /*フィルタの適用*/ for(i=width+1; i<width*height; i++) wo[i]=wi[i-1-width]*m1[0]+wi[i-width]*m1[1]+wi[i+1-width]*m1[2]+wi[i-1]*m1[3]+wi[i]*m1[4]+wi[i+1]*m1[5]+wi[i-1+width]*m1[6]+wi[i+width]*m1[7]+wi[i+1+width]*m1[8]; for(j=width+1; j<width*height; j++) wo2[j]=wi[j-1-width]*m2[0]+wi[j-width]*m2[1]+wi[j+1-width]*m2[2]+wi[j-1]*m2[3]+wi[j]*m2[4]+wi[j+1]*m2[5]+wi[j-1+width]*m2[6]+wi[j+width]*m2[7]+wi[j+1+width]*m2[8]; for(k=width+1; k<width*height; k++) wo[k] = (unsigned char)sqrt(wo[k]*wo[k]+wo2[k]*wo2[k]); /*画素値を0から255に*/ for(l=width+1; l<width*height; l++){ if((unsigned char)wo[l] < 0) w[l] = 0; else if((unsigned char)wo[l] > 255) w[l] = 255; else w[l] = wo[l]; } for(z=width+1; z<width*height; z++) wo[z] = w[z]; free(w); free(wo2); } よろしくお願いしますm(_ _)m

  • 画像を読み込んでヒストグラムを作るプログラム

    2値化画像を読み込んで、ヒストグラムを表示させるプログラムを作りたいのですが、 以下のソースを作成したのですが実行中にエラーが発生して困っています。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define width 640 #define height 480 int main(int argc, char* argv[]) { unsigned char image[640*480]; unsigned char header32[1078];//ビットマップ情報 int i; int *histogram; FILE *fp1; unsigned char buffer1[640*480]; for(i=0; i<640*480; i++) { image[i]=0; buffer1[i]=0; } fp1=fopen("koshimizu1.bmp","rb"); // fread(image,1,640*480,fp1); fread(header32,1,1078,fp1); fread(buffer1,width,height,fp1); fclose(fp1); for(i=0;i<256;i++){ histogram[i]=0; } for(i=0;i<640*480;i++){ histogram[image[i]]++; } for(i=0;i<256;i++){ printf("%d %d \n",i,histogram[i]); } return 0; }

  • 1bppファイルを8bpp(raw)に変換する。

    環境 Windows7 VS2008 SP1 1bppの画像を8bppに変換しようとしているのですが うまくいきません。自分ではこれで 合っていると思うのですが・・・ 何かアドバイスお願いしますm(__)m int Main1bppTo8bpp(WCHAR *filename,int width,int height) { //width,heightは8bppになったときの幅,高さを指定する。 FILE *fpt; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"1bppTo8bpp Error",L"1bppTo8bpp Error",MB_OK); return -1; } else { unsigned char *layer,*Output; layer=(unsigned char*)calloc(((width/8)+1)*height*sizeof(unsigned char),sizeof(unsigned char)); Output=(unsigned char*)malloc(width*height); //読み込み fread(&layer[0],sizeof(unsigned char),((width/8)+1)*height,fpt); FILE *fpt_output; _wfopen_s(&fpt_output,L"1bppTo8bpp.raw",L"wb"); int i,j,flag=0x00; for(i=0;i<((width/8)+1)*height;i+=((width/8)+1)) { for(j=0;j<((width/8)+1);j++) { //8bit目 if((layer[i+j]&BIT8)==BIT8) { Output[i+j+flag]=0x00; } else { Output[i+j+flag]=0xff; } //7bit目 if((layer[i+j]&BIT7)==BIT7) { Output[i+j+flag+1]=0x00; } else { Output[i+j+flag+1]=0xff; } //6bit目 if((layer[i+j]&BIT6)==BIT6) { Output[i+j+flag+2]=0x00; } else { Output[i+j+flag+2]=0xff; } //5bit目 if((layer[i+j]&BIT5)==BIT5) { Output[i+j+flag+3]=0x00; } else { Output[i+j+flag+3]=0xff; } //4bit目 if((layer[i+j]&BIT4)==BIT4) { Output[i+j+flag+4]=0x00; } else { Output[i+j+flag+4]=0xff; } //3bit目 if((layer[i+j]&BIT3)==BIT3) { Output[i+j+flag+5]=0x00; } else { Output[i+j+flag+5]=0xff; } //2bit目 if((layer[i+j]&BIT2)==BIT2) { Output[i+j+flag+6]=0x00; } else { Output[i+j+flag+6]=0xff; } //1bit目 if((layer[i+j]&BIT1)==BIT1) { Output[i+j+flag+7]=0x00; } else { Output[i+j+flag+7]=0xff; } flag=flag+8; } flag=0x00; } //最終的な「fwrite」はここでする。 fwrite(&Output[0],sizeof(unsigned char),width*height,fpt_output); free(layer); free(Output); fclose(fpt); fclose(fpt_output); } return 0;

  • SDKにてRAW画像(ヘッダ情報0)の表示

    現在RAW画像(ヘッダ情報0)の表示プログラムをSDKにて作成中です。 色々と細かな質問に対してお答えいただいた皆様に感謝します。 おかげで一応表示することができました。 しかし新たな疑問が出てきてしまいました。 詳しく説明します。 まず入力画像情報をグローバルな構造体により管理するため、 typedef struct{ unsigned char *Input_Image; int Width; int Height; HWND hwnd; char szFileName[MAX_PATH]; char szFileTitle[MAX_PATH]; LPBITMAPINFO lpBitmapInfo; HANDLE hMemBitmapInfo; HANDLE hMemInput_Image; int flag; }IMAGEINFORMATION; static IMAGEINFORMATION *Image; このように定義しました。 ちなみにこの構造体メンバの最初のメンバ*Input_Imageは入力画像が格納するポインタです。今回の問題に対しこの*Input_Imageメンバのみ注意をお願いします。 画像入力処理として Image->hMemInput_Image = GlobalAlloc(GHND, sizeof(unsigned char) * Image->Height * Image->Width); Image->Input_Image = (unsigned char *)GlobalLock(Image->hMemInput_Image); により画像情報のポインタをImage->Input_Imageに格納します。 しかし入力した情報をそのまま使用すると、表示した場合に上下さかさまに反転して表示されてしまうので、この後に画像情報の反転処理を行わなければなりません。この反転処理を行う関数をvoid ReverseBitmap(unsigned char *)として、内容を次に示します。 void ReverseBitmap(unsigned char *Input) {   int i, j, width, height;   unsigned char temp;   width = Image->Width-1;   height = Image->Height-1;   for(i=0; i<=height; i++){     for(j=0; j<=width; j++){       temp = Input[width * (height - i) + j];       Input[width * (height - i) + j] = Input[width * i + j];       Input[width * i + j] = temp;     }   } } 関数実行の記述は  ReverseBitmap(Image->Input_Image);  のように行いました。 これにより反転した配列が ReverseBitmap関数の引数に格納されていると考えたのですが、結果は反映されていませんでした。 結果として色々と試してみたのですが、どうやってもさかさまのまま表示されてしまいます。 関数への引数の渡し方、反転の仕方に問題があるようならアドバイスをお願いします。 そして、反転処理を記述した場合、2次元画像を1次元配列で操作するのは結構めんどくさいです。なのでこの上の定義をもとに、反転処理を2次元配列にて行うような方法はないでしょうか? こちらの疑問もよろしくお願いします。

  • fread エラー C Xcode bmpファイル

    こんにちは。プログラム初心者の大学生です。 現在研究室で作成しているプログラムについて、自身で解決できないエラーが出たため、 お詳しい方に教えていただけないものかと思い投稿しました。 以下のプログラムで、32ビットbmpファイルのヘッダ情報を読み込み、表示させようとしています。 展望としてはヘッダ情報を誘致しておき、後々参照する予定です。 プログラムはMacのXcode(C言語)で作成しているのですが、 fread(PictureHeadBuf, sizeof(unsigned char), 54 ,fpIN); の行で EXC_BAD_ACCESS と表示され、うまく動作しません。 配列のメモリ管理がどうも怪しそうですが、具体的な解決方法がわからない状態です。 なかなか先に進めずに困っています。もし原因のわかる方がいらっしゃれば教えてください。 ぜひよろしくお願い致します。 #include <stdio.h> #include <stdlib.h> /* 入力画像ファイル関連 */ #define FILE_NAME "test.bmp" /* 元データのファイル名 */ int main(void){ int i; /* 入力画像ファイル関連変数 */ FILE *fpIN; unsigned char PictureHeadBuf[54]; /* ヘッダ用バッファ */ unsigned char Header[54]; /* ヘッダの誘致先 */ /*入力画像ファイルをオープン*/ fpIN = fopen(FILE_NAME, "rb"); /*ヘッダ(ファイルヘッダ,情報ヘッダ)の格納 */ fread(PictureHeadBuf, sizeof(unsigned char), 54 ,fpIN); for(i = 0; i < 54; i++){ Header[i] = PictureHeadBuf[i]; printf("%d\n", Header[i]); } /* 入力画像をクローズ */ fclose(fpIN); return(0); }

  • icon format について

    Visual Studio.NET 2003 MFC を使用しています。 View画面で、アイコンを表示しようと思いました。 アイコン読み込みようのクラスを作成しました。 class icon { public: void IconHeadRead(FILE *fp,int *width,int *height) { unsigned char uc; unsigned short us; unsigned int ui; fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&uc,sizeof(unsigned char),1,fp);*width=uc; fread(&uc,sizeof(unsigned char),1,fp);*height=uc; fread(&uc,sizeof(unsigned char),1,fp); fread(&uc,sizeof(unsigned char),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&ui,sizeof(unsigned int),1,fp); }; void IconDataRead(FILE *fp,unsigned char *red,unsigned char *green,unsigned char *blue) { unsigned char uc; fread(&uc,sizeof(unsigned char),1,fp);*red=uc; fread(&uc,sizeof(unsigned char),1,fp);*green=uc; fread(&uc,sizeof(unsigned char),1,fp);*blue=uc; }; }; このred,green,blueの値を使用して、 SetPixelでドローしようと思いましたが、 変な表示になります。 width,heightは、正しいようです。 ICON フォーマットについて教えてください。 よろしくお願いします。 同じような要領で、bitmapは保存、読み込みはできました。

専門家に質問してみよう