WEB开发网
开发学院软件开发数据结构 投影法和差影法的源程序 阅读

投影法和差影法的源程序

 2009-10-29 11:58:59 来源:WEB开发网   
核心提示:以下是投影法的源程序,第二个参数是个BOOL变量,投影法和差影法的源程序,为真时表示在水平方向上做投影,否则在垂直方向上做投影,不过只用到了0和255两种灰度级,if( NumColors!=256){MessageBox(hWnd,"Must be a mono bitmap with grayscale

以下是投影法的源程序,第二个参数是个BOOL变量,为真时表示在水平方向上做投影,否则在垂直方向上做投影。要注意的是,我们针对的虽然是二值图,但为了处理的方便,用的是256级灰度图,不过只用到了0和255两种灰度级。

BOOL Projection(HWND hWnd,BOOL Hori)
{
DWORD        OffBits,BufSize;
LPBITMAPINFOHEADER  lpImgData;
LPSTR                lpPtr;
HLOCAL            hTempImgData;
LPBITMAPINFOHEADER  lpTempImgData;
LPSTR                lpTempPtr;
HDC                     hDc;
HFILE               hf;
LONG           x,y;
int                       num;
//用的是256级灰度图,不过只用到了0和255两种灰度级。
if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",
"Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//到位图数据的偏移值
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
//缓冲区大小
BufSize=OffBits+bi.biHeight*LineBytes;
//为新图缓冲区分配内存
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",
MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
//新图缓冲区初始化为255
memset(lpTempImgData,(BYTE)255,BufSize);
//拷贝头信息
memcpy(lpTempImgData,lpImgData,OffBits);
if(Hori)
{
//水平投影
for(y=0;y<bi.biHeight;y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
num=0; //计数器初始化为0
for(x=0;x<bi.biWidth;x++)
if(*(lpPtr++)!=0) //是白点
num++; //计数器加1
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<num;x++)
*(lpTempPtr++)=0; //在新图中,该行中共有num个黑点
}
}
else{ //垂直投影
for(x=0;x<bi.biWidth;x++){
num=0; //计数器初始化为0
lpPtr=(char *)lpImgData+(BufSize-LineBytes)+x;
for(y=0;y<bi.biHeight;y++){
if(*lpPtr!=0)
num++; //计数器加1
lpPtr-=LineBytes;
}
lpTempPtr=(char *)lpTempImgData+OffBits+x;
for(y=0;y<num;y++){
*lpTempPtr=0; //在新图中,该列中共有num个黑点
lpTempPtr+=LineBytes;
}
}
}
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);
//起不同的结果文件名
if(Hori)
hf=_lcreat("c:\\hproject.bmp",0);
else
hf=_lcreat("c:\\vproject.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
//释放内存和资源
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}

1 2  下一页

Tags:投影 源程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接