2016-12-03 5 views
1

私はこのデバイスコンテキストを持っていますが、元のRGB値を失うことなく.bmp形式または別の形式で保存するにはどうすればよいですか?私はこのデバイスのコンテキストを持っていますが、オリジナルのRGB値を失うことなく、どのように.bmp形式で保存するのですか? thx!bmpファイルにスクリーンショットを保存するデバイスコンテキスト

LPRGBQUAD hex_color; 


//HDC dc = GetDC(NULL); 

HWND hWnd = GetDesktopWindow(); 
HDC hdc = GetDC(hWnd); 

RECT rect; 
GetWindowRect(hWnd, &rect); 

int MAX_WIDTH = rect.right - rect.left; 
int MAX_HEIGHT = rect.bottom - rect.top; 

//cout << "MAX_WIDTH " << MAX_WIDTH << " MAX_HEIGHT " << MAX_HEIGHT << endl; 

HDC hdcTemp = CreateCompatibleDC(hdc); 

BITMAPINFO bitmap; 
bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader); 
bitmap.bmiHeader.biWidth = MAX_WIDTH; 
bitmap.bmiHeader.biHeight = -MAX_HEIGHT; 
bitmap.bmiHeader.biPlanes = 1; 
bitmap.bmiHeader.biBitCount = 32; 
bitmap.bmiHeader.biCompression = BI_RGB; 
bitmap.bmiHeader.biSizeImage = 0; 
bitmap.bmiHeader.biClrUsed = 0; 
bitmap.bmiHeader.biClrImportant = 0; 

LPRGBQUAD bitPointer; 
HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)&bitPointer, 0, 0); 

HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcTemp, hBitmap2); 
BitBlt(hdcTemp, 0, 0, MAX_WIDTH, MAX_HEIGHT, hdc, 0, 0, SRCCOPY); 

答えて

1

ビットのサイズが必要です。 32ビット画像の場合は、次のように、サイズが計算されます。

DWORD dib_size = MAX_WIDTH * MAX_HEIGHT * 4; 

あなたはまたbitmap.bmiHeader.biSizeImageにこの値を割り当てる必要があります。次

bitmap.bmiHeader.biSizeImage = dib_size; 

、あなたはbmpFileHeaderを必要とする:

BITMAPFILEHEADER bmpFileHeader = { 0 }; 
bmpFileHeader.bfType = 'MB'; 
bmpFileHeader.bfSize = 54 + dib_size; 
bmpFileHeader.bfOffBits = 54; 

bfType"BM"です(リトルエンディアンの場合は後方)、

bfSizesizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

const wchar_t* filename = L"__unicode.bmp"; 
HANDLE hfile = CreateFileW(filename, 
    GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
if(hfile != INVALID_HANDLE_VALUE) 
{ 
    DWORD temp; 
    WriteFile(hfile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &temp, NULL); 
    WriteFile(hfile, (BITMAPINFOHEADER*)&bitmap, sizeof(BITMAPINFOHEADER), &temp, NULL); 
    WriteFile(hfile, bitPointer, dib_size, &temp, NULL); 
    CloseHandle(hfile); 
} 

//release GDI resource handles 
SelectObject(hdcTemp, hbmpOld); 
DeleteObject(hBitmap2); 
DeleteDC(hdcTemp); 
+0

素晴らしいである54です!私はそれを勉強しようとする... –

関連する問題