[セットトップ]MFC図面まとめ-スクリーンショット、DIB/DBグラフィックPixelを取得


1.現在のScreenに対してCopy画面を行い、BITMAPを取得する
現在の画面のCopyに対して、現在の画面のHDCを取得する必要があります.
1つは、スクリーンDCから元の図を直接つかむことである.
1つは、互換性のあるMemDCを使用してスナップショットを行い、マウスを描くなど、グラフィックに関する処理を追加することができます.
(注:現在のプログラムのコピー画面の場合、GetDCパラメータを入力するにはthis->getsafehwnd()を使用します.
(注:指定ウィンドウCopy画面の場合、Spy++でウィンドウHWNDを取得し、GetDCに転送できます)
 
プログラムから元の図をつかむ方法は式より簡単です.例えば、次のようにします.
//       HDC

HDC hScreenDC = ::GetDC(NULL);

//       DC   BITMAP

HBITMAP hBmp = (HBITMAP) GetCurrentObject (hScreen, OBJ_BITMAP);


互換DCスナップショットを使用する例としては、以下のようなものがある.
//       HDC
HDC hScreenDC = ::GetDC(NULL);
//     HDC
HDC hMemDC = ::CreateCompatibleDC(hScreenDC)
//       
HBITMAP hbm = CreateCompatibleBitmap(hScreenDC, width, height);
//  MemDC      
HBITMAP oldbm = (HBITMAP) SelectObject(hMemDC, hbm);
//         
BitBlt(hMemDC, 0, 0, width, height, hScreenDC, left, top, SRCCOPY);	 	
//             
{//Draw the Cursor	
	ICONINFO iconinfo ;	
	BOOL ret;
	ret	= GetIconInfo( hcur,  &iconinfo ); 
	if (ret) {
		xPoint.x -= iconinfo.xHotspot;
		xPoint.y -= iconinfo.yHotspot;
		//need to delete the hbmMask and hbmColor bitmaps
		//otherwise the program will crash after a while after running out of resource
		if (iconinfo.hbmMask) DeleteObject(iconinfo.hbmMask);
		if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor);
	}		
	::DrawIcon( hMemDC,  xPoint.x,  xPoint.y, hcur); 
}
//       DC    
SelectObject(hMemDC,oldbm);

 
2.DDBパターンPixelを取得する
DDB-Devicedependency bitmapデバイス依存グラフィックス
現在のBitmapはDCで取得されているので、DDBタイプのグラフィックです.
CBitmapの関数GetBitmapBitsにより、関連するbitsコンテンツが取得されるか、GetBitmapを用いてBITMAP構造情報全体が取得されるようにしてもよい.
しかし、取得されたpixel情報は、現在のdeviceに関連しており、例えばdeviceが24ビット色/32ビット色/下から上へ描画/色マスクを用いる場合、取得されたpixelも同様である.
注意:ここでCBitmapはDDBパターンであり、CImage::GetBitsを使用してPixelを取得することはできません.詳細はCImage::IsDIBSectionの説明を参照してください.また、グラフィックを保存する場合は、CImage::Saveを借りてグラフィックを保存できます.
 
例:
//   hbmp

CBitmap bitmap;

Bitmap.attach(hBmp);

//     

byte pBuffer = new [width * 4 * height];

//   bits  

Bitmap. GetBitmapBits(pBuffer);


 
 
3.DIBグラフィックスPixelの取得
DIB-DeviceIndependency Bitmapデバイス無関係グラフィック
このような図形は,自身の構造に図形色ビット数/色テーブル/色マスク説明に関する情報を備えているので,これらの情報を社内から照会することに依存せず,デバイス依存図形とも呼ばれる.
HBItmapからDIBパターンを取得する関数には、GetDIBitsがよく使用されます.
GetDIBBitsは、現在のデバイスの構造情報を照会し、DIBヘッダ情報BITMAPINFOの説明に記入するために使用することができる.
一方、BITMAPINFO/指定グラフィックフォーマットを指定し、Bitmapから指定フォーマットのグラフィック情報を変換することができる.
2つの方法があります
1.デバイスのフォーマットを取得し、BItmapInfoに入力し、そのBitmapInfoに基づいてPixel情報を取得する
2.もう1つは、Bitmapinfoを直接指定し、指定されたフォーマットに基づいて変換されたPixsel情報を取得する
 
たとえば,この2つを兼ねて考えると,まずデバイスBitmapInfoを取得し,その後フォーマットを変更してからフォーマットを変更したグラフィックPixelを取得する.
//      PBITMAPINFO

LPBITMAPINFO lpBitmapInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD));

memset(lpBitmapInfo, 0, sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD));

lpBitmapInfo->bmiHeader.biSize = sizeof(lpBitmapInfo->bmiHeader);

// lpvBits  NULL    DIB  

if (GetDIBits(hMemDC, hBmp, 0, 0, NULL, lpBitmapInfo, DIB_RGB_COLORS))

{

         //     ,           Pixel  

lpBitmapInfo->bmiHeader.biCompression = BI_RGB;

         lpBitmapInfo->bmiHeader.biBitCount = 24;

         //     DIB  

         GetDIBits(hMemDC, (HBITMAP)cBitmap.GetSafeHandle(), 0, nHeight, pBuffer, lpBitmapInfo, DIB_RGB_COLORS);

}

//          

delete lpBitmapInfo;

Owed by:春の夜は雨が降るhttp://blog.csdn.net/chunyexiyu転載は出所を明記してください