[セットトップ]MFC図面まとめ-スクリーンショット、DIB/DBグラフィックPixelを取得
1.現在のScreenに対してCopy画面を行い、BITMAPを取得する
現在の画面のCopyに対して、現在の画面のHDCを取得する必要があります.
1つは、スクリーンDCから元の図を直接つかむことである.
1つは、互換性のあるMemDCを使用してスナップショットを行い、マウスを描くなど、グラフィックに関する処理を追加することができます.
(注:現在のプログラムのコピー画面の場合、GetDCパラメータを入力するにはthis->getsafehwnd()を使用します.
(注:指定ウィンドウCopy画面の場合、Spy++でウィンドウHWNDを取得し、GetDCに転送できます)
プログラムから元の図をつかむ方法は式より簡単です.例えば、次のようにします.
互換DCスナップショットを使用する例としては、以下のようなものがある.
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を借りてグラフィックを保存できます.
例:
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を取得する.
Owed by:春の夜は雨が降るhttp://blog.csdn.net/chunyexiyu転載は出所を明記してください
現在の画面の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転載は出所を明記してください