Win32 のグラフィック操作系のメモ

DC の内容をファイルに保存

こんな具合に。

void SaveBitmap(HDC hdc, DWORD dwWidth, DWORD dwHeight, LPCTSTR lpszFn) 
{
	DWORD dwSize,dwFSize,dwLength;
	HANDLE fh;
	LPBITMAPFILEHEADER lpHead;
	LPBITMAPINFOHEADER lpInfo;
	LPBYTE lpBuf,lpPixel;
	RECT rec;
	HDC hdcMem;
	HBITMAP hBMP,hOld;
	
	if ((dwWidth*3) % 4==0) /* バッファの1ラインの長さを計算 */
		dwLength=dwWidth*3;
	else
		dwLength=dwWidth*3+(4-(dwWidth*3) % 4);
	
		/* 書き込み用バッファのサイズ計算 */
		dwFSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwLength*dwHeight;
	
	/* バッファ確保とポインタ設定 */
	lpBuf=(LPBYTE)GlobalAlloc(GPTR,dwFSize);
	lpHead=(LPBITMAPFILEHEADER)lpBuf;
	lpInfo=(LPBITMAPINFOHEADER)(lpBuf+sizeof(BITMAPFILEHEADER));
	lpPixel=lpBuf+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	
	/* 24ビットBMPファイルのヘッダ作成 */
	lpHead->bfType='M'*256+'B';
	lpHead->bfSize=dwFSize;
	lpHead->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	lpInfo->biSize=sizeof(BITMAPINFOHEADER);
	lpInfo->biWidth=dwWidth;
	lpInfo->biHeight=dwHeight;
	lpInfo->biPlanes=1;
	lpInfo->biBitCount=24;
	
	/* ウインドウのデバイスコンテキスト互換のBITMAP作成 */
	hBMP=CreateCompatibleBitmap(hdc,dwWidth,dwHeight);
	
	/* BITMAPにウインドウのクライアント領域をコピー */
	hdcMem=CreateCompatibleDC(hdc);
	hOld=(HBITMAP)SelectObject(hdcMem,hBMP);
	BitBlt(hdcMem,0,0,dwWidth,dwHeight,hdc,0,0,SRCCOPY);
	SelectObject(hdcMem,hOld);
	GetDIBits(hdc,hBMP,0,dwHeight,lpPixel,(LPBITMAPINFO)lpInfo,DIB_RGB_COLORS);
	
	//ReleaseDC(hwnd,hdc);
	DeleteObject(hBMP);
	DeleteObject(hdcMem);
	
	/* バッファをファイルに書き出す */
	fh=CreateFile(lpszFn,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	WriteFile(fh,lpBuf,dwFSize,&dwSize,NULL);
	CloseHandle(fh);
	
	GlobalFree(lpBuf);
}
ex.)

hDC = GetDC( hWnd );

SaveBitmap( hDC, 1024, 1024, ".\\test.bmp" );

プログラム・開発系メモ


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-15 (土) 12:07:55 (5258d)