📄 vc++开发腐蚀运算源程序.txt
字号:
VC++开发腐蚀运算源程序
下面的这段程序,实现了上述的腐蚀运算,针对的都是黑色点。参数中有一个BOOL 变量,
为真时,表示在水平方向进行腐蚀运算,即结构元素B 为(1 ,1. ,1)否则在竖直方向上进
行腐蚀运算,即结构元素B 为1 1.1 。<br>
BOOL Erosion(HWND hWnd,BOOL Hori)
{
DWORD BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
unsigned char num;
int i;
//为了处理的方便,仍采用256 级灰度图,不过只用到了调色板中0 和255 两项
if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with
grayscale palette!","Error Message",
MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//BufSize 为缓冲区大小
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
//为新的缓冲区分配内存
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);
//拷贝头信息和位图数据
memcpy(lpTempImgData,lpImgData,BufSize);
if(Hori)
{
//在水平方向进行腐蚀运算
for(y=0;y<bi.biHeight;y++){
//lpPtr 指向原图数据,lpTempPtr 指向新图数据
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+1;
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+1;
for(x=1;x<bi.biWidth-1;x++){ //注意为防止越界,x 的范围从1 到宽度-2
num=(unsigned char)*lpPtr;
if (num==0){ //因为腐蚀掉的是黑点,所以只对黑点处理
*lpTempPtr=(unsigned char)0; //先置成黑点
for(i=0;i<3;i++){
num=(unsigned char)*(lpPtr+i-1);
if(num==255){
//自身及上下邻居中若有一个不是黑点,则将该点腐蚀掉,
//变成白点
*lpTempPtr=(unsigned char)255;
break;
}
}
}
//原图中就是白点的,新图中仍是白点
else *lpTempPtr=(unsigned char)255;
//指向下一个像素
lpPtr++;
lpTempPtr++;
}
}
}
else{
//在竖直方向进行腐蚀运算
for(y=1;y<bi.biHeight-1;y++){ //注意为防止越界,y 的范围从1 到高度-2
//lpPtr 指向原图数据,lpTempPtr 指向新图数据
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<bi.biWidth;x++){
num=(unsigned char)*lpPtr;
if (num==0){ //因为腐蚀掉的是黑点,所以只对黑点处理
*lpTempPtr=(unsigned char)0; //先置成黑点
for(i=0;i<3;i++){
num=(unsigned char)*(lpPtr+(i-1)*LineBytes);
if(num==255){
//自身及上下邻居中若有一个不是黑点,则将该点腐蚀掉,
//变成白点
*lpTempPtr=(unsigned char)255;
break;
}
}
}
//原图中就是白点的,新图中仍是白点
else *lpTempPtr=(unsigned char)255;
//指向下一个像素
lpPtr++;
lpTempPtr++;
}
}
}
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:\\herosion.bmp",0);
else
hf=_lcreat("c:\\verosion.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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -