C语言写了一个截取屏幕的代码,但生成的bmp文件提示不支持此文件格式。

C语言写了一个截取屏幕的代码,但生成的bmp文件提示不支持此文件格式。

#include

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);
}