c#数字图象处理24位转8位并标记计数出现了问题,急!

2022-03-17 教育 46阅读
可以参考下面的程序,其中bitCount!=8&&bitCount!=24指的就是8位与24位

//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;imemcpy(dest,src,rowByteSize);
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;
}
}
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com