原创 在IpliIMAGE转换为bmp过程中出现的问题(待续)

2009-3-3 21:32 4639 14 13 分类: 软件与OS
 问题是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) ? 1pbmpinfo->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;



}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
14
关闭 站长推荐上一条 /3 下一条