ウィンドウのクライアント領域をjpegで保存したいです
Posted: 2020年4月24日(金) 22:28
ウィンドウの画像が切れた状態で保存されるのですが、本来はクライアント領域のみをjpeg保存したいです。
どのように修正したらよろしいでしょうか?
どのように修正したらよろしいでしょうか?
BOOL SaveImage(LPTSTR filename, HWND hWnd)
{
HDC hdc;
RECT rc;
BITMAP bmp;
HBITMAP hbmp;
HBITMAP hbmpPrev;
GetClientRect(hWnd, &rc);
hdc = CreateCompatibleDC(NULL);
hbmp = CreateBackbuffer(rc.right, rc.bottom);
hbmpPrev = (HBITMAP)SelectObject(hdc, hbmp);
BitBlt(hdc, 0, 0, rc.right, rc.bottom, GetWindowDC(hWnd), 0, 0, SRCCOPY);
GetObject(hbmp, sizeof(BITMAP), &bmp);
if (WriteBitmap(filename, rc.right, rc.bottom, bmp.bmBits))
{
MessageBox(hWnd, "保存完了", "保存済み", MB_OK);
}
else
{
MessageBox(hWnd, "保存されませんでした", "Error!!", MB_OK);
}
SelectObject(hdc, hbmpPrev);
DeleteObject(hbmp);
DeleteDC(hdc);
return TRUE;
}
HBITMAP CreateBackbuffer(int nWidth, int nHeight)
{
LPVOID lp;
BITMAPINFO bmi;
BITMAPINFOHEADER bmiHeader;
ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = nWidth;
bmiHeader.biHeight = nHeight;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmi.bmiHeader = bmiHeader;
return CreateDIBSection(NULL, (LPBITMAPINFO)& bmi, DIB_RGB_COLORS, &lp, NULL, 0);
}
BOOL WriteBitmap(LPTSTR lpszFileName, int nWidth, int nHeight, LPVOID lpBits)
{
HANDLE hFile;
DWORD dwResult;
DWORD dwSizeImage;
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bmiHeader;
hFile = CreateFile(lpszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
dwSizeImage = nHeight * ((3 * nWidth + 3) / 4) * 4;
ZeroMemory(&bmfHeader, sizeof(BITMAPFILEHEADER));
bmfHeader.bfType = *(LPWORD)"BM";
bmfHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSizeImage;
bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
WriteFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER), &dwResult, NULL);
ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = nWidth;
bmiHeader.biHeight = nHeight;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmiHeader.biSizeImage = dwSizeImage;
bmiHeader.biCompression = BI_RGB;
WriteFile(hFile, &bmiHeader, sizeof(BITMAPINFOHEADER), &dwResult, NULL);
WriteFile(hFile, lpBits, dwSizeImage, &dwResult, NULL);
CloseHandle(hFile);
return TRUE;
}