【框架-MFC】保存HBITMAP对象到*.bmp文件

来源:互联网 发布:android存储数据的目录 编辑:程序博客网 时间:2024/05/15 23:47
BOOL CMyDlg::SaveBitmapToFile( HBITMAP hBitmap, CString szfilename ){HDC     hDC;           //当前分辨率下每象素所占字节数            int     iBits;           //位图中每象素所占字节数            WORD     wBitCount;           //定义调色板大小,     位图中像素字节大小     ,位图文件大小     ,     写入文件字节数                DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;               //位图属性结构                BITMAP     Bitmap;                   //位图文件头结构            BITMAPFILEHEADER     bmfHdr;                   //位图信息头结构                BITMAPINFOHEADER     bi;                   //指向位图信息头结构                    LPBITMAPINFOHEADER     lpbi;                   //定义文件,分配内存句柄,调色板句柄                HANDLE     fh,   hDib,   hPal,hOldPal=NULL;               //计算位图文件每个像素所占字节数                hDC  = CreateDC(pC_DISPLAY,   NULL,   NULL,   NULL);           iBits  = GetDeviceCaps(hDC,   BITSPIXEL)     *     GetDeviceCaps(hDC,   PLANES);               DeleteDC(hDC);               if(iBits <=  1)                                                     wBitCount = 1;               else  if(iBits <=  4)                                 wBitCount  = 4;               else if(iBits <=  8)                                 wBitCount  = 8;               else                                                                                                                                 wBitCount  = 24;  GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);           bi.biSize= sizeof(BITMAPINFOHEADER);           bi.biWidth = Bitmap.bmWidth;           bi.biHeight =  Bitmap.bmHeight;           bi.biPlanes =  1;           bi.biBitCount = wBitCount;           bi.biCompression= BI_RGB;           bi.biSizeImage=0;           bi.biXPelsPerMeter = 0;           bi.biYPelsPerMeter = 0;           bi.biClrImportant = 0;           bi.biClrUsed =  0;           dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;           //为位图内容分配内存                hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));               lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);               *lpbi  = bi;               //     处理调色板                    hPal  = GetStockObject(DEFAULT_PALETTE);               if (hPal)               {               hDC  = ::GetDC(NULL);               hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);               RealizePalette(hDC);               }           //     获取该调色板下新的像素值                GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,    (LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize,     (BITMAPINFO *)lpbi, DIB_RGB_COLORS);               //恢复调色板                    if (hOldPal)               {               ::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);               RealizePalette(hDC);               ::ReleaseDC(NULL,   hDC);               }               //创建位图文件                    fh  = CreateFile(szfilename,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,             FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);               if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;               //     设置位图文件头                bmfHdr.bfType  = 0x4D42;     //     "BM"                dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;                   bmfHdr.bfSize  = dwDIBSize;               bmfHdr.bfReserved1  = 0;               bmfHdr.bfReserved2  = 0;               bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;               //     写入位图文件头                WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);               //     写入位图文件其余内容                WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,   &dwWritten,   NULL);               //清除                    GlobalUnlock(hDib);               GlobalFree(hDib);               CloseHandle(fh);               return     TRUE;   }

0 0