Opencv:IplImage转换为bmp的过程及相关问题

 

转帖自:http://blog.ednchina.com/opencv2008/201557/message.aspx

 

 

 

问题是bmp文件要求

 文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,

     否则,需要在后端补0,凑足4的倍数。 

     以字节为单位的每行长度始终是4的倍数。行的长度可以计算为:

     RowLength = 4 * ((bmch.bcWidth * bmch.bcBitCount + 31) / 32) ;        

     如果需要,可通过在右边补充行(通常是用零)来完成长度。图素数据的总字节数等于      RowLength和bmch.bcHeight的乘积。

 

 

所以在计算空间的时候,就要使用上面的公式计算出长度来,利用RowLength和bmch.bcHeight的乘积的成绩来开辟空间,不然就会出错

3月2号:

所有代码

 

/********************************************************

//将IplImage文件转换为BMP文件

//IplImage *pmg         opencv里面的文件格式

//BITMAPINFO *pbmpinfo  得到的bmp文件图像信息头

//BYTE **pbmpdata       得到的bmp图像文件数据

//********************************************************

BOOL Ipl2BMP(IplImage *Iplmg,BITMAPINFO **pbmpinfo,BYTE **pbmpdata)

{

    BYTE    *p=new BYTE[2048];

    *pbmpinfo=(BITMAPINFO*)p;

 

    (*pbmpinfo)->bmiHeader.biSize         =sizeof(BITMAPINFOHEADER);

    (*pbmpinfo)->bmiHeader.biBitCount     =Iplmg->nChannels*8;

    (*pbmpinfo)->bmiHeader.biClrUsed      =0;

    (*pbmpinfo)->bmiHeader.biCompression  =BI_RGB;

    (*pbmpinfo)->bmiHeader.biHeight       =Iplmg->height;

    (*pbmpinfo)->bmiHeader.biWidth        =Iplmg->width;

    (*pbmpinfo)->bmiHeader.biPlanes       =1;

    (*pbmpinfo)->bmiHeader.biSizeImage    =0;

    (*pbmpinfo)->bmiHeader.biXPelsPerMeter=0;

    (*pbmpinfo)->bmiHeader.biYPelsPerMeter=0;

 

 

    int ImgSize=(((*pbmpinfo)->bmiHeader.biWidth  *  (*pbmpinfo)->bmiHeader.biBitCount +  31 )/32) * 4  * (*pbmpinfo)->bmiHeader.biHeight;

 

     (*pbmpdata)=new BYTE[ImgSize+1];

 

    memcpy(*pbmpdata,Iplmg->imageData,ImgSize);

 

    return TRUE;

 

}

 

//******************************************************

//bmp文件转换IPLImage文件

//******************************************************

IplImage *BMP2Ipl(BITMAPINFO *pbmpinfo,BYTE *pbmpdata)

{

 

    int channal=(pbmpinfo->bmiHeader.biBitCount == 1) ? 1:(pbmpinfo->bmiHeader.biBitCount/8);

    //仅限于二值图像和灰度图像

    //int depth  =(pbmpinfo->bmiHeader.biBitCount == 1) ? IPL_DEPTH_1U : IPL_DEPTH_8U;

    int depth  =  IPL_DEPTH_8U;

 

    int width=pbmpinfo->bmiHeader.biWidth;

    int heigh=pbmpinfo->bmiHeader.biHeight;

 

    IplImage *pmg;

 

    pmg=cvCreateImageHeader(cvSize(width,heigh),depth,channal);

        pmg->imageData=(char*)malloc(pmg->imageSize);

    //cvSetData();

    memcpy(pmg->imageData,pbmpdata,pmg->imageSize);

 

        return pmg;

 

 

 

}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值