BMP图像文件TO数据区的互换

BMP图像文件TO数据区的互换

                                                                                                                               cndg                         2006/04/25

       一般为了查看图象的效果,比如写了一个算法,想看看效果怎么样,可以把图像数据(一维或者二维数组)保存到BMP文件看效果。下面写一些代码实现BMP文件TO图象数据,图象数据TOBMP文件。

1、图象数据到BMP文件转换。

/*
*   函数功能:数据到BMP的转换
*  参数说明:unsigned char *p,指向图像数据区域;
                        int width,图像的高度;
                        int height,图像的宽度;
                        int bitcount,每个像数的字节数
* 返回值:VOID
*/

void DataToBmp(unsigned char *p, int width, int height, int bitcount, int flag = 0)
{
 BITMAPFILEHEADER bmfHdr;
//定义文件头
 BITMAPINFOHEADER bmiHdr;
//定义信息头
 RGBQUAD rgbQuad[256];   
//定义调色板
 int i;
 int dpl;
 int colorused = 0;
 int nbytes;
 nbytes = bitcount / 8;
    //对信息头进行赋值
 bmiHdr.biSize = sizeof(BITMAPINFOHEADER);
 bmiHdr.biWidth = width;
 bmiHdr.biHeight = height;
 bmiHdr.biPlanes = 1;
 bmiHdr.biBitCount = bitcount;
 bmiHdr.biCompression = BI_RGB;
 bmiHdr.biSizeImage = 0;
 bmiHdr.biXPelsPerMeter = 0;
 bmiHdr.biYPelsPerMeter = 0;
 bmiHdr.biClrUsed = 0;
 bmiHdr.biClrImportant = 0;
 memset(rgbQuad,0,sizeof(rgbQuad));
 if (bitcount == 8)
  for (i=0;i<256;i++){
   rgbQuad[i].rgbBlue =i;
   rgbQuad[i].rgbGreen =i;
   rgbQuad[i].rgbRed =i;
   rgbQuad[i].rgbReserved =0;
  }
  if( bmiHdr.biBitCount<=8 )
  {
   colorused=bmiHdr.biClrUsed;
   if( colorused==0) colorused=1<<bmiHdr.biBitCount;
  }
  
  //dpl = ((bmiHdr.biWidth * bmiHdr.biBitCount + 31) & ~31) >> nbytes;
  if (width*nbytes % 4 == 0)
  {
   dpl = width*nbytes;
  }
  else
  {
   dpl = width*nbytes + 4 - width*nbytes%4;
  }
  int actualdpl = dpl;
  if (flag == 1)
  {
   dpl = width*nbytes;
  }
  //对文件头进行赋值
  bmfHdr.bfType = 19778;//;((WORD)('M'<<8) | 'B')
  bmfHdr.bfReserved1 = 0;
  bmfHdr.bfReserved2 = 0;
  bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+ bmiHdr.biSize + colorused*sizeof(RGBQUAD);
  bmfHdr.bfSize= (bmfHdr.bfOffBits+dpl*height);
  //保存文件
  CFile fp;
  fp.Open("d://Model.bmp",CFile::modeCreate | CFile::modeWrite);
  fp.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
//写文件头
  fp.Write((LPSTR)&bmiHdr,sizeof(BITMAPINFOHEADER));
//写信息头
  fp.Write((LPSTR)rgbQuad,sizeof(RGBQUAD)*colorused);   
//写调色板
  int j;
  int value = 0;
  for (i=0; i<height; i++)
  {
   fp.Write((LPSTR)(p+dpl*i), width*nbytes);
//写数据
   for (j=0; j<actualdpl-width*nbytes; j++)
   {
    fp.Write((LPSTR)(&value), 1);
   }
   // fp.Write((LPSTR)0, dpl - width*3);
  }
  
  fp.Close();
}

2、BMP文件到图象数据转换。

根据文件的格式包数据读到一片内存中。
请参考:http://www.vckbase.com/document/viewdoc/?id=674

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byxdaz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值