2016-12-03 30 views
1

我有這個設備上下文,如何將它保存爲.bmp或其他格式而不會丟失原始RGB值?我有這個設備上下文,如何將它保存爲.bmp或其他格式而不會丟失原始RGB值? 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

您需要大小的位。

DWORD dib_size = MAX_WIDTH * MAX_HEIGHT * 4; 

你也應該這樣值分配給bitmap.bmiHeader.biSizeImage:對於32位圖像,如下大小計算

bitmap.bmiHeader.biSizeImage = dib_size; 

接下來,你需要bmpFileHeader

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

bfType"BM" (倒退爲小端),

bfSize54這是sizeof(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

真棒!讓我試着去研究它... –

相關問題