自分なりにいろいろ調査しそれらしきBMPイメージを取得できたのですが、ビューアーで「ファイルが破損しているか、大きすぎる可能性があります」と表示されファイルが開けません。そこで再度質問をさせて頂きたいと思います。
【現象】
BMPファイルは生成できたもののファイルが開けません。また、ファイルのプロパティを確認するとサイズ自体は5,769,844バイトが得られました。
【ソース、メモリ情報】
○メモリ情報
?BMPInfo
0x03130020 {biSize=40 biWidth=1078 biHeight=1783 ...}
biSize: 40
biWidth: 1078
biHeight: 1783
biPlanes: 1
biBitCount: 24
biCompression: 0
biSizeImage: 5769788
biXPelsPerMeter: 15748
biYPelsPerMeter: 15748
biClrUsed: 0
biClrImportant: 0
○処理の概要
上記BMPInfoの情報を元にBITMAPFILEHEADERやBITMAPINFOHEADERに値を格納し、ビットマップイメージを生成
○ソースコード
BITMAPFILEHEADER BmpFileHeader; // ビットマップファイルヘッダ
BITMAPINFOHEADER BmpInfoHeader; // ビットマップ情報ヘッダ
//unsigned long ImageSize = (BMPInfo->biWidth) * (BMPInfo->biHeight) * 3; // データサイズ
unsigned long ImageSize = BMPInfo->biSizeImage; // データサイズ
unsigned char *b;
//BITMAP用メモリを確保
b = (unsigned char*) malloc(ImageSize);
if (b == NULL) {
return -1;
}
// BITMAPFILEHEADERを設定
memset(&BmpFileHeader, 0x00, sizeof(BmpFileHeader));
BmpFileHeader.bfType = 0x4D42; //ビットマップのファイルタイプ
BmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + ImageSize;
BmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
// BITMAPINFOHEADERを設定
memset(&BmpInfoHeader, 0x00, sizeof(BmpInfoHeader));
BmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
BmpInfoHeader.biWidth = BMPInfo->biWidth;
BmpInfoHeader.biHeight = BMPInfo->biHeight;
BmpInfoHeader.biPlanes = BMPInfo->biPlanes;
BmpInfoHeader.biBitCount = BMPInfo->biBitCount;
BmpInfoHeader.biCompression = BMPInfo->biCompression;
BmpInfoHeader.biSizeImage = ImageSize;
// 出力ファイルオープン
FILE *fp = NULL;
if (fopen_s(&fp, "sample.bmp", "wb") != 0){
return -1;
}
// BITMAPFILEHEADERを書き込む。
if (fwrite(&BmpFileHeader, sizeof(BmpFileHeader), 1, fp) != 1){
fclose(fp);
return -1;
}
// BITMAPINFOHEADERを書き込む。
if (fwrite(&BmpInfoHeader, sizeof(BmpInfoHeader), 1, fp) != 1){
fclose(fp);
return -1;
}
// 画像データを書き込む。
if (fwrite( b,sizeof(unsigned char) ,ImageSize, fp) != (size_t)ImageSize){
fclose(fp);
return -1;
}
// 出力ファイルを閉じる。
free(b);
fclose(fp);