C语言写了一个截取屏幕的代码,但生成的bmp文件提示不支持此文件格式。
void jt()//截图函数
{
CWnd* desktopWnd = CWnd::GetDesktopWindow();
CDC* desktopDC = desktopWnd->GetDC();
CRect re;
desktopWnd->GetClientRect(&re);
CBitmap bmp;
bmp.CreateCompatibleBitmap(desktopDC, re.Width(), re.Height());
CDC myDC;
myDC.CreateCompatibleDC(desktopDC);
myDC.SelectObject(&bmp);
myDC.BitBlt(0, 0, re.Width(), re.Height(), desktopDC, 0, 0, SRCCOPY);
BITMAP bitmapStruct;
bmp.GetBitmap(&bitmapStruct);
DWORD size = bitmapStruct.bmWidthBytes * bitmapStruct.bmHeight;
//LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR, size);
BITMAPINFOHEADER bitmapHead;
bitmapHead.biBitCount = 24;
bitmapHead.biClrImportant = 0;
bitmapHead.biCompression = BI_RGB;
bitmapHead.biHeight = bitmapStruct.bmHeight;
bitmapHead.biWidth = bitmapStruct.bmWidth;
bitmapHead.biSizeImage = size;
bitmapHead.biPlanes = 1;
bitmapHead.biSize = sizeof(BITMAPFILEHEADER);
bitmapHead.biXPelsPerMeter = 0;
bitmapHead.biYPelsPerMeter = 0;
LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR, size);
GetDIBits(desktopDC->m_hDC, bmp, 0, bitmapHead.biHeight, lpdata, (BITMAPINFO*)&bitmapHead, DIB_RGB_COLORS);
BITMAPFILEHEADER bitmapFileHead;
bitmapFileHead.bfReserved1 = 0;
bitmapFileHead.bfReserved2 = 0;
bitmapFileHead.bfType = 'M' << 8 | 'B';
bitmapFileHead.bfSize = 14 + 40 + size;
bitmapFileHead.bfOffBits = 14 + 40;
CString fileName = "jt.bmp";
CFile file;
if (file.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
file.Write(&bitmapFileHead, sizeof(bitmapFileHead));
file.Write(&bitmapHead, sizeof(bitmapHead));
file.Write(lpdata, size);
file.Close();
}
GlobalFree(lpdata);
}
int main()
{
jt();
return 0;
}
用二进制方式打开bmp文件看看文件头格式有没有错误
(C++实现截图截屏功能汇总):https://blog.csdn.net/hhy321/article/details/121548612
void jt()//截图函数
{
CWnd* desktopWnd = CWnd::GetDesktopWindow();
CDC* desktopDC = desktopWnd->GetDC();
CRect re;
desktopWnd->GetClientRect(&re);
CBitmap bmp;
bmp.CreateCompatibleBitmap(desktopDC, re.Width(), re.Height());
CDC myDC;
myDC.CreateCompatibleDC(desktopDC);
myDC.SelectObject(&bmp);
myDC.BitBlt(0, 0, re.Width(), re.Height(), desktopDC, 0, 0, SRCCOPY);
BITMAP bitmapStruct;
bmp.GetBitmap(&bitmapStruct);
DWORD size = bitmapStruct.bmWidthBytes * bitmapStruct.bmHeight;
//LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR, size);
BITMAPINFOHEADER bitmapHead;
bitmapHead.biBitCount = 24;
bitmapHead.biClrImportant = 0;
bitmapHead.biCompression = BI_RGB;
bitmapHead.biHeight = bitmapStruct.bmHeight;
bitmapHead.biWidth = bitmapStruct.bmWidth;
bitmapHead.biSizeImage = size;
bitmapHead.biPlanes = 1;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////这里修改 on 2022/7/22
bitmapHead.biSize = sizeof(BITMAPINFOHEADER);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bitmapHead.biXPelsPerMeter = 0;
bitmapHead.biYPelsPerMeter = 0;
LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR, size);
GetDIBits(desktopDC->m_hDC, bmp, 0, bitmapHead.biHeight, lpdata, (BITMAPINFO*)&bitmapHead, DIB_RGB_COLORS);
BITMAPFILEHEADER bitmapFileHead;
bitmapFileHead.bfReserved1 = 0;
bitmapFileHead.bfReserved2 = 0;
bitmapFileHead.bfType = 'M' << 8 | 'B';
bitmapFileHead.bfSize = 14 + 40 + size;
bitmapFileHead.bfOffBits = 14 + 40;
CString fileName =L"d://jt.bmp";
CFile file;
if (file.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
file.Write(&bitmapFileHead, sizeof(bitmapFileHead));
file.Write(&bitmapHead, sizeof(bitmapHead));
file.Write(lpdata, size);
file.Close();
}
GlobalFree(lpdata);
}