//----------------------------------------------------------------------------
// BITMAPのファイル出力
//----------------------------------------------------------------------------
// BOOL SaveBitmapFile(
// HBITMAP bmp, // BUTMAPハンドル
// LPSTR filename // 出力ファイル名
// );
//
// 関数が成功したときはTRUE,失敗するとFALSEを返す。
//----------------------------------------------------------------------------
BOOL SaveBitmapFile(HBITMAP bmp,LPSTR filename)
{
// BITMAP情報を取得する
BITMAP bi;
ZeroMemory(&bi,sizeof(bi));
if(GetObject(bmp,sizeof(bi),&bi) == 0)return FALSE;
// ファイルサイズ計算
LONG filesize = bi.bmWidthBytes * bi.bmHeight + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
LONG bpp = 0;
switch(bi.bmBitsPixel){
case 2:
filesize += (sizeof(RGBQUAD) * 2);
bpp = 2;
break;
case 4:
filesize += (sizeof(RGBQUAD) * 16);
bpp = 16;
break;
case 8:
filesize += (sizeof(RGBQUAD) * 256);
bpp = 256;
break;
}
// ファイルオープン
HFILE fp = _lcreat(filename,0);
if(fp == HFILE_ERROR)return FALSE;
// BITMAPFILEHEADERヘッダー出力
BITMAPFILEHEADER fh;
ZeroMemory(&fh,sizeof(fh));
memcpy(&fh.bfType,"BM",2);
fh.bfSize = filesize;
fh.bfReserved1 = 0;
fh.bfReserved2 = 0;
fh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * bpp;
_lwrite(fp,(LPSTR)&fh,sizeof(fh));
// BITMAPINFOHEADERヘッダー出力
LPBITMAPINFO pbi = (LPBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * bpp);
ZeroMemory(pbi,sizeof(BITMAPINFOHEADER));
pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbi->bmiHeader.biWidth = bi.bmWidth;
pbi->bmiHeader.biHeight = bi.bmHeight;
pbi->bmiHeader.biPlanes = 1;
pbi->bmiHeader.biBitCount = bi.bmBitsPixel;
pbi->bmiHeader.biCompression = BI_RGB;
if(bpp != 0){
GetDIBColorTable(bmp,0,bpp,pbi->bmiColors);
}
_lwrite(fp,(LPSTR)pbi,sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * bpp);
// 画像データを得る
LPBYTE bits = (LPBYTE)malloc(bi.bmWidthBytes * bi.bmHeight);
HDC dc = GetDC(0);
HDC mdc = CreateCompatibleDC(dc);
ReleaseDC(0,dc);
HBITMAP old = SelectObject(mdc,bmp);
int l = GetDIBits(mdc,bmp,0,bi.bmHeight,bits,pbi,DIB_RGB_COLORS);
_lwrite(fp,(LPSTR)bits,bi.bmWidthBytes * bi.bmHeight);
// 作業領域を開放
free(pbi);
free(bits);
_lclose(fp);
return TRUE;
}
//----------------------------------------------------------------------
// 以下は、BITMAP画像で保存するサンプルです。
//----------------------------------------------------------------------
HBITMAP bmp = BITMAPハンドル;
SaveBitmapFile(bmp,"bitmap.bmp"); // BITMAPハンドルとファイル名を渡します