截屏函数,包含DDBtoDIB

    技术2022-05-19  20

    写远控时写的:

     

    void GetScreen(LPTSTR path){ DWORD BmpSize,offbits; CDC hDc,hCompatibleDc; hDc.CreateDC(L"Display", NULL, NULL, NULL);//屏幕设备上下文 hCompatibleDc.CreateCompatibleDC(&hDc);//内存兼容性设备上下文 CBitmap BmpCatch; BmpCatch.CreateCompatibleBitmap(&hDc, hDc.GetDeviceCaps(HORZRES), hDc.GetDeviceCaps(VERTRES));//兼容性位图 hCompatibleDc.SelectObject(BmpCatch);

     hCompatibleDc.BitBlt(0, 0, hDc.GetDeviceCaps(HORZRES), hDc.GetDeviceCaps(VERTRES), &hDc, 0, 0, SRCCOPY);//获取设备信息

     HANDLE hBmp = DDBtoDIB(BmpCatch, BI_RGB, &BmpSize, &offbits);

     BITMAPFILEHEADER bmpfile;//文件头信息 bmpfile.bfType = ((WORD)('M'<<8|'B')); bmpfile.bfSize = BmpSize; bmpfile.bfReserved1 = 0; bmpfile.bfReserved2 = 0; bmpfile.bfOffBits = offbits + sizeof(BITMAPFILEHEADER); HANDLE hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); DWORD dwWrite;

     

    //全部写入 WriteFile(hFile, &bmpfile, sizeof(BITMAPFILEHEADER), &dwWrite, NULL); WriteFile(hFile, hBmp, bmpfile.bfSize, &dwWrite, NULL);

     DeleteDC(hDc); GlobalFree(hBmp);   CloseHandle(hFile);}

     

     

    HANDLE DDBtoDIB(CBitmap& BmpCatch, DWORD dwCompression, DWORD* bmpsize, DWORD* offbits)//设备依赖转设备无依赖{ BITMAP bmp; BITMAPINFOHEADER bmphead;//信息头 LPBITMAPINFOHEADER lpbmphead; DWORD len; HPALETTE hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE); HDC hDC; HANDLE hDIB;

     BmpCatch.GetObject(sizeof(bmp), &bmp);

     bmphead.biSize = sizeof(BITMAPINFOHEADER); bmphead.biWidth = bmp.bmWidth; bmphead.biHeight = bmp.bmHeight; bmphead.biPlanes = 1; bmphead.biBitCount = bmp.bmBitsPixel; bmphead.biCompression = dwCompression; bmphead.biSizeImage = 0; bmphead.biXPelsPerMeter = 0; bmphead.biYPelsPerMeter = 0; bmphead.biClrUsed = 0; bmphead.biClrImportant = 0;

     int nColors = ( 1 << bmphead.biBitCount ); if ( bmphead.biBitCount > 8 )nColors = 0; len = bmphead.biSize + nColors * sizeof(RGBQUAD);//bmp信息头大小+调色板大小

     hDC  =  GetDC(NULL);   hPal  =  SelectPalette(hDC,hPal,FALSE);   RealizePalette(hDC);

     hDIB  =  GlobalAlloc(GMEM_FIXED,len);

     if ( !hDIB ) {    SelectPalette(hDC,hPal,FALSE);    ReleaseDC(NULL,hDC);    return  NULL;   }

     lpbmphead = (LPBITMAPINFOHEADER)hDIB;

     *lpbmphead = bmphead;

     GetDIBits(hDC, (HBITMAP)BmpCatch.GetSafeHandle(), 0, bmp.bmHeight, NULL, (LPBITMAPINFO)lpbmphead, DIB_RGB_COLORS);//获取bmp实质内容大小

     bmphead = *lpbmphead;

     if ( !bmphead.biSizeImage )//未成功自己计算 {  bmphead.biSizeImage = ((((bmphead.biWidth * bmphead.biBitCount) + 31) & ~31) >> 3 ) * bmphead.biHeight; } len += bmphead.biSizeImage;//大小增加

     if ( !(hDIB = GlobalReAlloc(hDIB, len, GMEM_MOVEABLE)) ) {  GlobalFree(hDIB);  SelectPalette(hDC,hPal,FALSE);    ReleaseDC(NULL,hDC);    return  NULL;   }

     lpbmphead = (LPBITMAPINFOHEADER)hDIB;

     int nScan = GetDIBits(hDC, (HBITMAP)BmpCatch.GetSafeHandle(), 0, bmp.bmHeight,(LPSTR)lpbmphead + bmphead.biSize + nColors * sizeof(RGBQUAD),  (LPBITMAPINFO)lpbmphead, DIB_RGB_COLORS);//实现DDB转换入内存缓冲区(与设备脱离依赖) if ( !nScan ) {  GlobalFree(hDIB);    SelectPalette(hDC,hPal,FALSE);    ReleaseDC(NULL,hDC);    return  NULL;  } *bmpsize = len; *offbits = bmphead.biSize + nColors * sizeof(RGBQUAD); SelectPalette(hDC,hPal,FALSE);   ReleaseDC(NULL,hDC);   return  hDIB; }


    最新回复(0)