【实战】BMP文件保存与ImageList读取

文摘   社会   2024-10-28 16:50   广西  

调用方法:SaveBitmapToFile(cbm, "1.bmp");

bool SaveBitmapToFile(CBitmap* bitmap, LPSTR lpFileName)  {                  HBITMAP hBitmap;    // 为刚才的屏幕位图句柄      HDC hDC; //设备描述表        int iBits; //当前显示分辨率下每个像素所占字节数        WORD wBitCount; //位图中每个像素所占字节数        DWORD dwPaletteSize = 0, //定义调色板大小          dwBmBitsSize,  //位图中像素字节大小             dwDIBSize,   //位图文件大小          dwWritten;  //写入文件字节数      BITMAP Bitmap; //位图属性结构        BITMAPFILEHEADER bmfHdr; //位图文件头结构        BITMAPINFOHEADER bi; //位图信息头结构          LPBITMAPINFOHEADER lpbi; //指向位图信息头结构        HANDLE fh,   //定义文件          hDib,    //分配内存句柄          hPal,   //调色板句柄          hOldPal = NULL;            //计算位图文件每个像素所占字节数        hBitmap = (HBITMAP)*bitmap;        hDC = CreateDC("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 if (iBits <= 24)            wBitCount = 24;        else if (iBits <= 32)          wBitCount = 32;            //计算调色板大小        if (wBitCount <= 8)            dwPaletteSize = (1 << wBitCount) * sizeof (RGBQUAD);            //设置位图信息头结构        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.biClrUsed = 0;        bi.biClrImportant = 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,          (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);              //恢复调色板           if (hOldPal)          {            SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);            RealizePalette(hDC);            ::ReleaseDC(NULL, hDC);      }              //创建位图文件                  fh = CreateFile(lpFileName, 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;      }
void GetImage(CImageList& imglist, CBitmap& dist ,int num){CClientDC dc(NULL);
IMAGEINFO ii;imglist.GetImageInfo(num, &ii);
int nWidth = ii.rcImage.right - ii.rcImage.left;int nHeight = ii.rcImage.bottom - ii.rcImage.top;
dist.CreateCompatibleBitmap(&dc, nWidth, nHeight);CDC memDC;memDC.CreateCompatibleDC(&dc);CBitmap* pOldBitmap = memDC.SelectObject(&dist);
memDC.FillSolidRect(0, 0, nWidth, nHeight, RGB(255,255,255) );
imglist.Draw(&memDC, num, CPoint(0, 0), ILD_NORMAL);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
::DeleteObject(ii.hbmImage);::DeleteObject(ii.hbmMask);}


暮色的狐
这是一只高强度上网冲浪、高质量输出内容的狐狸。主打ACGN杂谈、技术干货分享、第九艺术鉴赏、网梗百科解析、情感树洞鸡汤、正能量价值观~
 最新文章