//BMP与IplImage相互转换
///////////////////////////////头文件bmp2ipl.h
//bmp2ipl.h
#ifndefBMP2IPL_H
#defineBMP2IPL_H
classBMP{
public:
BMP():bmpData(NULL){
memset(&biHeader,0,sizeof(biHeader));
}
BMP(constBMP&img);
BMP(constIplImage&img);
BMP(intwidth,intheight,intbitCount);
~BMP(){delete[]bmpData;}
boolCreateImage(constBITMAPINFOHEADER&biHeader);
//Export
IplImage*BMP2Ipl();
//voidShow(HWNDhWnd,intnID);
//voidShow(CDC*pDC,CRect&rect);
//voidShow(HWNDhWnd);
voidReSize(intnewW,intnewH);
private:
voidCopyData(char*dest,constchar*src,intdataByteSize,
boolisConvert,intheight);
//isConvert=true进行顶左和底左之间的转换(顶左到底左或底左到顶左),否则不转换
//biSizeImagemaybesettozeroforBI_RGBbitmaps,socalculateit.
intImgSize(){
return(biHeader.biHeight*((biHeader.biWidth*biHeader.biBitCount/8+3)&(-4)));
}
public:
voidClear();
BITMAPINFOHEADERbiHeader;
unsignedchar*bmpData;
};
#endif
/////////////////////////////////////////////////////////////////////实现文件bmp2ipl.cpp
#include"bmp2ipl.h"
BMP::BMP(constBMP&img)
{
if(!IsSupport(img)){
BMP();
return;
}
//biHeader=img.biHeader;
PBITMAPINFOHEADERpBmpH=(PBITMAPINFOHEADER)&img.biHeader;
memcpy(&biHeader,pBmpH,sizeof(BITMAPINFOHEADER));
biHeader.biSizeImage=ImgSize();
boolisLowerLeft=biHeader.biHeight>0;
//introwSize=0;
if(!isLowerLeft)biHeader.biHeight=-biHeader.biHeight;
if(bmpData!=NULL)delete[]bmpData;
bmpData=newunsignedchar[biHeader.biSizeImage];
//memcpy(bmpData,img.bmpData,img.biHeader.biSizeImage);
CopyData((char*)bmpData,(char*)img.bmpData,biHeader.biSizeImage,
!isLowerLeft,biHeader.biHeight);
}
BMP::BMP(constIplImage&img){
if(!IsSupport(img)){
BMP();
return;
}
boolisTopLeft=(img.origin==IPL_ORIGIN_TL);
biHeader.biSize=sizeof(BITMAPINFOHEADER);
biHeader.biWidth=img.width;
biHeader.biHeight=img.height;
biHeader.biPlanes=1;
biHeader.biBitCount=img.depth*img.nChannels;
biHeader.biCompression=BI_RGB;
biHeader.biSizeImage=img.imageSize;
biHeader.biXPelsPerMeter=0;
biHeader.biYPelsPerMeter=0;
biHeader.biClrUsed=0;
biHeader.biClrImportant=0;
if(bmpData!=NULL)delete[]bmpData;
bmpData=newunsignedchar[img.imageSize];
//memcpy(bmpData,img.ImageData,img.imageSize);
CopyData((char*)bmpData,(char*)img.imageData,img.imageSize,
isTopLeft,img.height);
}
BMP::BMP(intwidth,intheight,intbitCount){
if(bitCount!=8&&bitCount!=24)return;
biHeader.biSize=sizeof(BITMAPINFOHEADER);
biHeader.biWidth=width;
biHeader.biHeight=height;
biHeader.biPlanes=1;
biHeader.biBitCount=bitCount;
biHeader.biCompression=BI_RGB;
biHeader.biSizeImage=ImgSize();
biHeader.biXPelsPerMeter=0;
biHeader.biYPelsPerMeter=0;
biHeader.biClrUsed=0;
biHeader.biClrImportant=0;
if(bmpData!=NULL)delete[]bmpData;
bmpData=newunsignedchar[biHeader.biSizeImage];
Clear();
}
//dest:thedestinationimage
//dataByteSize:theSourceimage
//height:sourceimageheight
voidBMP::CopyData(char*dest,constchar*src,intdataByteSize,
boolisConvert,intheight){
char*p=dest;
if(!isConvert){
memcpy(dest,src,dataByteSize);
return;
}
if(height<=0)return;
//intheight=dataByteSize/rowByteSize;
introwByteSize=dataByteSize/height;
src=src+dataByteSize-rowByteSize;
for(inti=0;i
dest+=rowByteSize;
src-=rowByteSize;
}
}
IplImage*BMP::BMP2Ipl(){
if(!IsSupport(*this))returnNULL;
IplImage*iplImg;
intheight;
boolisLowerLeft=biHeader.biHeight>0;
height=(biHeader.biHeight>0)?biHeader.biHeight:-biHeader.biHeight;
iplImg=cvCreateImage(cvSize(biHeader.biWidth,height),IPL_DEPTH_8U,biHeader.biBitCount/8);
//iplImg=cvCreateImageHeader(cvSize(biHeader.biWidth,height),IPL_DEPTH_8U,biHeader.biBitCount/8);
//cvSetData(iplImg,(char*)bmpData,biHeader.biSizeImage/height);
CopyData(iplImg->imageData,(char*)bmpData,biHeader.biSizeImage,
isLowerLeft,height);
returniplImg;
}
voidBMP::Clear(){
if(bmpData==NULL)return;
memset(bmpData,0,ImgSize());
}
voidBMP::ReSize(intnewW,intnewH){
biHeader.biWidth=newW;
biHeader.biHeight=newH;
biHeader.biSizeImage=ImgSize();
if(bmpData!=NULL)delete[]bmpData;
bmpData=newunsignedchar[biHeader.biSizeImage];
Clear();
}
boolBMP::CreateImage(constBITMAPINFOHEADER&bih){
memset(&biHeader,0,sizeof(BITMAPINFOHEADER));
delete[]bmpData;
bmpData=NULL;
memcpy(&biHeader,&bih,sizeof(BITMAPINFOHEADER));
biHeader.biSizeImage=ImgSize();
bmpData=newunsignedchar[biHeader.biSizeImage];
if(bmpData==NULL)returnfalse;
else{
Clear();
returntrue;
}
}