问题是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条评论)
登录后参与讨论