//////////////////////////////////////////////////////////////////////////////////////////////////////////////// //CHU130開発キットのサンプルで取り込んだGrayScale8bitの画像生データRAWをビットマップファイルとして保存するには //簡単なGrayScale画像でもパレット情報が必要だったのでその方法のメモ.(画像の横幅が4で割り切れる場合のみの簡易版) //BITMAPファイルの最初に書き込まれるヘッダ情報(BMPFILEHEADERとBMPINFOHEADER)は構造体を自作しています. //ただの構造体として宣言するとメモリ上に左詰めでみっちりと詰め込まれず, //ファイルに書き込んだときに位置ずれして正しいBMPファイルにならないため,#pragma pack(1)で隙間なく詰めることを宣言する必要があります. // //じつはこの構造体はGDIPlusには含まれており,wingdi.hを読み込むと作らなくても使えます. //BCC55ではGDIPlusが使えないためこのように自分で作る必要があります.BCC102推奨の理由はこれです. //ちなみにGDIPlusを使うと.Saveでjpgやpngに保存することもできますがここではファイル構造を明快にするためあえてこの様な方法で保存しています. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include #include char filename[255]; char filedefoult[] = "ux.raw"; #pragma pack(1) typedef struct BMPFILEHEADER{ char bfType[2]; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; }BMPFILEHEADER; typedef struct BMPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; }BMPINFOHEADER; #pragma pack() int main(int argc, char *argv[]){ if(!argv[1]){ strcpy(filename, filedefoult); }else{ strcpy(filename,argv[1]); } BITMAPFILEHEADER bmpHeader; BITMAPINFOHEADER bmpInfo; RGBQUAD bmpRGB[256]; BYTE bmpData[640*480]; //BITMAPFILEHEADER構造体 bmpHeader.bfType = 0x4d42; bmpHeader.bfSize = 640 * 480 * 1 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ 256*4; bmpHeader.bfReserved1 = 0; bmpHeader.bfReserved2 = 0; bmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ 256*4; //BITMAPINFOHEADER構造体 bmpInfo.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.biWidth = 640; bmpInfo.biHeight = 480; bmpInfo.biPlanes = 1; bmpInfo.biBitCount = 8; bmpInfo.biCompression = 0; bmpInfo.biSizeImage = 640 * 480 * 1; bmpInfo.biXPelsPerMeter = 1; bmpInfo.biYPelsPerMeter = 1; bmpInfo.biClrUsed = 0; bmpInfo.biClrImportant = 0; // pallet for (int i = 0 ; i < 256 ; i++){ bmpRGB[i].rgbBlue =i; bmpRGB[i].rgbGreen =i; bmpRGB[i].rgbRed =i; bmpRGB[i].rgbReserved =0; } // 画像本体の読み込み FILE* fp; fp = fopen(filename, "rb"); if(!fp){ printf("ファイルがない\n"); return 0; } for (int i = 0 ; i < 480 ; i++){ for(int j =0 ; j < 640 ; j++){ fread(&bmpData[i*640 + j], 1, 1, fp); } } fclose(fp); //ヘッダ情報から順に書き込み fp = fopen("mcroout.bmp","wb"); fwrite(&bmpHeader,sizeof(BITMAPFILEHEADER),1,fp); fwrite(&bmpInfo,sizeof(BITMAPINFOHEADER),1,fp); fwrite(bmpRGB,sizeof(bmpRGB),1,fp); fwrite(&bmpData,sizeof(bmpData),1,fp); fclose(fp); return 0; }