CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

已知 RGB24 数据、长、宽,如何保存为BMP文件,请具体的讲,最好有代码

楼主aa3000(杀手K)2004-12-03 16:53:01 在 VC/MFC / 图形处理/算法 提问

已知   RGB24   数据、长、宽,如何保存为BMP文件,请具体的讲,最好有代码 问题点数:100、回复次数:5Top

1 楼vcleaner(我没当大哥很久了.......)回复于 2004-12-03 17:02:32 得分 45

参考:  
  void   CCreateRandomBMPDlg::OnBtnCreateBMP()  
  {  
  CDC   dc;  
  dc.CreateDC("DISPLAY",   NULL,   NULL,   NULL);  
  CBitmap   bm;  
  int   Width   =   800;//GetSystemMetrics(SM_CXSCREEN);  
  int   Height   =   600;//GetSystemMetrics(SM_CYSCREEN);  
  bm.CreateCompatibleBitmap(&dc,   Width,   Height);  
  CDC   tdc;  
  tdc.CreateCompatibleDC(&dc);  
  CBitmap*   pOld   =   tdc.SelectObject(&bm);  
  tdc.BitBlt(0,   0,   Width,   Height,   &dc,   0,   0,   SRCCOPY);  
  tdc.SelectObject(pOld);  
   
  BITMAP   btm;  
  bm.GetBitmap(&btm);  
  DWORD   size   =   btm.bmWidthBytes*   btm.bmHeight;  
  LPSTR   lpData   =   (LPSTR)   GlobalAllocPtr(GPTR,   size);  
  /////////////////////////////////////////////  
   
   
  /////////////////////////////////////////////  
  BITMAPINFOHEADER   bih;  
  bih.biBitCount   =   btm.bmBitsPixel;  
  bih.biClrImportant   =   0;  
  bih.biClrUsed   =   0;  
  bih.biCompression   =   0;  
  bih.biHeight   =   btm.bmHeight;  
  bih.biPlanes   =   1;  
  bih.biSize   =   sizeof(BITMAPINFOHEADER);  
  bih.biSizeImage   =   size;  
  bih.biWidth   =   btm.bmWidth;  
  bih.biXPelsPerMeter   =   0;  
  bih.biYPelsPerMeter   =   0;  
  ///////////////////////////////////  
  GetDIBits(dc,   bm,   0,   bih.biHeight,   lpData,   (BITMAPINFO   *)   &bih,  
  DIB_RGB_COLORS);  
  // bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱  
  //////////////////////////////  
  //修改RGB值  
  int   nWidth   =   btm.bmWidth   *   4;  
  for   (int   i   =   0;   i   <   btm.bmHeight;   i++)  
  {  
  for   (int   j   =   0;   j   <   btm.bmWidth;   j++)  
  {  
  lpData[i   *   nWidth   +   j   *   4   +   2]   =   GetRandomRGBValue(); //R  
  lpData[i   *   nWidth   +   j   *   4   +   1]   =   GetRandomRGBValue(); //G  
  lpData[i   *   nWidth   +   j   *   4]   =   GetRandomRGBValue(); //B  
  TRACE("\nR   =   %d;   G   =   %d;   B   =   %d\n",  
  lpData[i   *   nWidth   +   j   *   4   +   2],  
  lpData[i   *   nWidth   +   j   *   4   +   1],   lpData[i   *   nWidth   +   j   *   4]);  
  }  
  }  
   
  static   int   filecount   =   0;  
  CString   name;  
  name   =   "D:\\Test.bmp";//m_Path+name;  
  BITMAPFILEHEADER   bfh;  
  bfh.bfReserved1   =   bfh.bfReserved2   =   0;  
  bfh.bfType   =   ((WORD)   ('M'   <<   8)   |   'B');  
  bfh.bfSize   =   54   +   size;  
  bfh.bfOffBits   =   54;  
   
  CFile   bf;  
  if   (bf.Open(name,   CFile::modeCreate   |   CFile::modeWrite))  
  {  
  bf.WriteHuge(&bfh,   sizeof(BITMAPFILEHEADER));  
  bf.WriteHuge(&bih,   sizeof(BITMAPINFOHEADER));  
  bf.WriteHuge(lpData,   size);  
  bf.Close();  
  }  
  GlobalFreePtr(lpData);  
  AfxMessageBox("Create   BMP   File   Over!");  
  }Top

2 楼vcleaner(我没当大哥很久了.......)回复于 2004-12-03 17:03:38 得分 10

我是创建一个随机象素的BMP,RGB值是使用GetRandomRGBValue获得的一个随机数的!Top

3 楼aa3000(杀手K)回复于 2004-12-03 17:10:15 得分 0

关键是我不知道   RGB   数据格式和   BMP   文件格式是什么关系.请教Top

4 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-12-03 17:10:51 得分 45

CFile fileBmp;  
  if(fileBmp.Open("Hello.bmp",CFile::modeWrite   |CFile::shareExclusive   |   CFile::modeCreate))  
  {  
  BITMAPINFOHEADER fmtFrame =   {sizeof(BITMAPINFOHEADER),   0,   0,   1,   24,   BI_RGB,   0,   0,   0,   0,   0};  
  fmtFrame.biWidth =   w;  
  fmtFrame.biHeight =   h;  
  fmtFrame.biSizeImage =(w+3)/4*4*h*3;  
  BITMAPFILEHEADER   fInfo;  
  ZeroMemory(&fInfo,   sizeof   fInfo);  
  fInfo.bfType   =   0x4D42;  
  fInfo.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   sizeof(BITMAPINFOHEADER);  
  fInfo.bfSize   =   fInfo.bfOffBits   +   fmtFrame.biSizeImage;  
  fileBmp.Write(&fInfo,   sizeof   fInfo);  
  fileBmp.Write(&fmtFrame,sizeof(fmtFrame));  
  fileBmp.Write(pBits,fmtFrame.biSizeImage);  
  }  
  fileBmp.Close();Top

5 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-12-03 18:10:22 得分 0

如果是RGB24/RGB16话,前面是一个文件头,后面就是位数据。Top

相关问题

  • 保存的代码?
  • 如和保存 bmp 文件到 jpg 或 gif 格式文件,最好纯VB代码,不用其他附加库
  • 100分跪求:抓取当前窗口的DLL或将数据窗口保存为BMP的源代码
  • 很急!!!请问:1、如何将BMP图象保存到SQL SERVER数据库中?2、从数据库取出BMP字段显示?希望有源代码!
  • 怎样保存<IFRAME>中的源代码?
  • 如何保存位bmp?
  • 怎样在javascript 代码段里保存jsp代码段里的Vector
  • 图像倒置问题(有代码,RGB)
  • VB6中我想保存源代码时提示“行太长”让我无法保存,要如何保存?请教!
  • sourcesafe是不是保存源代码的理想工具?

关键词

  • dc
  • null
  • bih
  • btm
  • tdc
  • bm
  • height
  • width

得分解答快速导航

  • 帖主:aa3000
  • vcleaner
  • vcleaner
  • DentistryDoctor

相关链接

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

广告也精彩

反馈

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