内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

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

时间:2015-02-21 01:36:37 来源: 作者: 人气: 评论:

HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight)
{
 HDC hBufDC;
HBITMAP hBitmap, hBitTemp;
//创建设备上下文(HDC)
hBufDC CreateCompatibleDC(hDC);
//创建HBITMAP
hBitmap CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
 hBitTemp (HBITMAP) SelectObject(hBufDC, hBitmap);
 //得到位图缓冲区
StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
 //得到最终的位图信息
 hBitmap (HBITMAP) SelectObject(hBufDC, hBitTemp);
//释放内存
 DeleteObject(hBitTemp);
 ::DeleteDC(hBufDC);
return hBitmap;
}
BOOL SaveBmp(HBITMAP hBitmap, CString FileName) 
 {
 //设备描述表
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("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) 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(FileName, 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;
  }

分享给小伙伴们:
本文标签:CDC  bmp格式  

相关文章

    无相关信息

发表评论共有条评论

友情链接1 百悠游站点 |

友情链接2: 帝国CMS |

百悠游站点,电脑学习,游戏网赚分享,游戏工作室门户网站。

Copyright (C) buyzd.cn, All Rights Reserved.

百悠游站点 版权所有