CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

请问如何将CBITMAP类上的位图保存到位图文件?

楼主chenglf(程圆缘)2002-07-30 14:10:17 在 VC/MFC / 基础类 提问

如上,另如何在保存之前设置位图的格式为黑白格式? 问题点数:50、回复次数:1Top

1 楼wistaria(听风听雨)回复于 2002-08-02 10:33:55 得分 50

//try   this    
  //lpfilename   为位图文件名  
  int   SaveBitmapToFile(HBITMAP   hbitmap   ,   LPSTR   lpfilename)  
  {    
  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;  
   
  //计算位图文件每个像素所占字节数  
  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   <=   16)  
  wbitcount   =   16;  
  else   if   (ibits   <=   24)  
  wbitcount   =   24;  
  else    
  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,(BITMAPINFO*)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;  
  }  
  Top

相关问题

  • 如何保存CBitmap对象到磁盘文件*.bmp
  • 保存文件
  • 保存文件
  • 保存txt文件
  • 文件的保存
  • 怎样编辑Cbitmap对象中的图形文件并保存,是否还要用到第三方代码
  • 保存到文件中
  • 如何保存ICO文件
  • 关于文件保存.
  • CommonDialog保存文件问题

关键词

  • 文件
  • 像素
  • 结构
  • null
  • 图
  • ibits
  • hdc
  • 大小
  • 像素所占字节数

得分解答快速导航

  • 帖主:chenglf
  • wistaria

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo