投影法和差影法的源程序
2009-10-29 11:58:59 来源:WEB开发网以下是差影法的源程序。要注意的是,第一幅图的文件名为c:\test.bmp,第二幅图的文件名是c:\backgnd.bmp。它们有着相同的灰度值和调色板。执行时,这两个文件都已经准备好。我们针对的虽然是二值图,但为了处理的方便,用的是256级灰度图,不过只用到了0和255两种灰度级。
BOOL Subtraction(HWND hWnd)
{
DWORD OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HGLOBAL hSecond;
LPBITMAPINFOHEADER lpSecondImgData;
LPSTR lpSecondPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
int num,pos;
//用的是256级灰度图,不过只用到了0和255两种灰度级。
if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",
"Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if((hf=_lopen("c:\\backgnd.bmp",OF_READ))==HFILE_ERROR){
//背景图没找到
MessageBox(hWnd,"File c:\\backgnd.bmp not found!","Error Message",
MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//到位图数据的偏移值
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
//缓冲区大小
BufSize=OffBits+bi.biHeight*LineBytes;
//为背景图的数据分配内存
if((hSecond=GlobalAlloc(GHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",
MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
//指向该内存指针
lpSecondImgData=(LPBITMAPINFOHEADER)GlobalLock(hSecond);
//文件指针指到BITMAPINFOHEADER结构开始的地方
_llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN);
//读入头信息和位图数据
_lread(hf,(LPSTR)lpSecondImgData,BufSize);
_lclose(hf);
//为结果图缓冲区分配内存
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",
MB_OK|MB_ICONEXCLAMATION);
GlobalUnlock(hSecond);
GlobalFree(hSecond);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
//新图缓冲区初始化为255
memset(lpTempImgData,(BYTE)255,BufSize);
//拷贝头信息
memcpy(lpTempImgData,lpImgData,OffBits);
for(y=0;y<bi.biHeight;y++){
pos=(BufSize-LineBytes-y*LineBytes);
//lpPtr指向第一幅图,lpSecondPtr指向第二幅图,lpTempPtr指向结果图
lpPtr=(char *)lpImgData+pos;
lpSecondPtr=(char *)lpSecondImgData+pos;
lpTempPtr=(char *)lpTempImgData+pos;
for(x=0;x<bi.biWidth;x++){
num=(unsigned char)*(lpPtr++);
num-=(unsigned char)*(lpSecondPtr++);
*(lpTempPtr++)=(unsigned char)fabs(num);
//两者相减取绝对值,存入新图中
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
hDc=GetDC(hWnd);
//创立一个新的位图
hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,
(LONG)CBM_INIT,
(LPSTR)lpTempImgData+
sizeof(BITMAPINFOHEADER)+
NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData,
DIB_RGB_COLORS);
hf=_lcreat("c:\\subtract.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
//释放内存和资源
ReleaseDC(hWnd,hDc);
GlobalUnlock(hSecond);
GlobalFree(hSecond);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
更多精彩
赞助商链接