怎么样把CDC上的一个图保存为bmp格式的图

    xiaoxiao2025-10-15  2

    001   HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight) 002   { 003       HDC hBufDC; 004       HBITMAP hBitmap, hBitTemp; 005        //创建设备上下文(HDC) 006       hBufDC = CreateCompatibleDC(hDC); 007        //创建HBITMAP 008       hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight); 009       hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap); 010        //得到位图缓冲区 011       StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,hDC, 0, 0, BitWidth, BitHeight, SRCCOPY); 012        //得到最终的位图信息 013       hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp); 014        //释放内存 015       DeleteObject(hBitTemp); 016       ::DeleteDC(hBufDC); 017        return  hBitmap; 018   } 019    BOOL  SaveBmp(HBITMAP hBitmap, CString FileName)  020  { 021      //设备描述表 022      HDC hDC; 023      //当前分辨率下每象素所占字节数 024      int iBits; 025      //位图中每象素所占字节数 026      WORD wBitCount; 027      //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数  028      DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;  029      //位图属性结构  030      BITMAP Bitmap;  031      //位图文件头结构 032      BITMAPFILEHEADER bmfHdr;  033      //位图信息头结构  034      BITMAPINFOHEADER bi;  035      //指向位图信息头结构  036      LPBITMAPINFOHEADER lpbi;  037      //定义文件,分配内存句柄,调色板句柄  038      HANDLE fh, hDib, hPal,hOldPal=NULL;  039      //计算位图文件每个像素所占字节数  040      hDC = CreateDC("DISPLAY", NULL, NULL, NULL); 041      iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);  042      DeleteDC(hDC);  043      if (iBits <= 1) wBitCount = 1;  044      else if (iBits <= 4) wBitCount = 4;  045      else if (iBits <= 8) wBitCount = 8;  046      else wBitCount = 24;  047      GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap); 048      bi.biSize = sizeof(BITMAPINFOHEADER); 049       bi.biWidth = Bitmap.bmWidth; 050       bi.biHeight = Bitmap.bmHeight; 051       bi.biPlanes = 1; 052       bi.biBitCount = wBitCount; 053       bi.biCompression = BI_RGB; 054       bi.biSizeImage = 0; 055       bi.biXPelsPerMeter = 0; 056       bi.biYPelsPerMeter = 0; 057       bi.biClrImportant = 0; 058       bi.biClrUsed = 0; 059       dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight; 060        //为位图内容分配内存  061       hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize +  sizeof (BITMAPINFOHEADER));  062       lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);  063       *lpbi = bi;  064        // 处理调色板  065       hPal = GetStockObject(DEFAULT_PALETTE);  066        if  (hPal)  067       {  068           hDC = ::GetDC(NULL);  069           hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal,  FALSE );  070           RealizePalette(hDC);  071       } 072        // 获取该调色板下新的像素值  073       GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi +  sizeof (BITMAPINFOHEADER)  074           +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);  075        //恢复调色板  076        if  (hOldPal)  077       {  078           ::SelectPalette(hDC, (HPALETTE)hOldPal,  TRUE );  079           RealizePalette(hDC);  080           ::ReleaseDC(NULL, hDC);  081       }  082        //创建位图文件  083       fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,  084           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);  085        if  (fh == INVALID_HANDLE_VALUE)  return   FALSE 086        // 设置位图文件头  087       bmfHdr.bfType = 0x4D42;  // "BM"  088       dwDIBSize =  sizeof (BITMAPFILEHEADER) +  sizeof (BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  089       bmfHdr.bfSize = dwDIBSize; 090       bmfHdr.bfReserved1 = 0;  091       bmfHdr.bfReserved2 = 0; 092       bmfHdr.bfOffBits = (DWORD) sizeof (BITMAPFILEHEADER) + (DWORD) sizeof (BITMAPINFOHEADER) + dwPaletteSize; 093        094        // 写入位图文件头 095       WriteFile(fh, (LPSTR)&bmfHdr,  sizeof (BITMAPFILEHEADER), &dwWritten, NULL);  096        // 写入位图文件其余内容  097        // WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除  098       GlobalUnlock(hDib);  099       GlobalFree(hDib);  100       CloseHandle(fh);  101        return   TRUE ; 102   }
    转载请注明原文地址: https://ju.6miu.com/read-1303192.html
    最新回复(0)