📄 edge.c
字号:
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;
TempNum=(float)((unsigned char)*(lpPtr+2*LineBytes-2))*Template_Log[0];
TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes-1))*Template_Log[1];
TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes))*Template_Log[2];
TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes+1))*Template_Log[3];
TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes+2))*Template_Log[4];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes-2))*Template_Log[5];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes-1))*Template_Log[6];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*Template_Log[7];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*Template_Log[8];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+2))*Template_Log[9];
TempNum+=(float)((unsigned char)*(lpPtr-2))*Template_Log[10];
TempNum+=(float)((unsigned char)*(lpPtr-1))*Template_Log[11];
TempNum+=(float)((unsigned char)*(lpPtr))*Template_Log[12];
TempNum+=(float)((unsigned char)*(lpPtr+1))*Template_Log[13];
TempNum+=(float)((unsigned char)*(lpPtr+2))*Template_Log[14];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-2))*Template_Log[15];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*Template_Log[16];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*Template_Log[17];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*Template_Log[18];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+2))*Template_Log[19];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes-2))*Template_Log[20];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes-1))*Template_Log[21];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes))*Template_Log[22];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes+1))*Template_Log[23];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes+2))*Template_Log[24];
TempNum*=coef;
if(TempNum>255.0) *lpTempPtr=(BYTE)255;
else if(TempNum<0.0)
*lpTempPtr=(unsigned char)fabs(TempNum);
else *lpTempPtr=(BYTE)TempNum;
}
hDc=GetDC(hWnd);
if(hBitmap!=NULL)
DeleteObject(hBitmap);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
hf=_lcreat("c:\\log.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;
}
////////////////////////////////////////////////////////////////
BOOL Contour(HWND hWnd)
{
DWORD OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
POINT StartP,CurP;
BOOL found;
int i;
int direct[8][2]={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};
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=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);
memset(lpTempImgData,(BYTE)255,BufSize);
memcpy(lpTempImgData,lpImgData,OffBits);
found=FALSE;
for (y=0;y<bi.biHeight && !found; y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for (x=0;x<bi.biWidth && !found; x++)
if (*(lpPtr++) ==0) found=TRUE;
}
if(found){
StartP.x=x-1;
StartP.y=y-1;
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-StartP.y*LineBytes)+StartP.x;
*lpTempPtr=(unsigned char)0;
CurP.x=StartP.x+1;
CurP.y=StartP.y;
lpPtr=(char *)lpImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;
if(*lpPtr!=0){
CurP.x=StartP.x+1;
CurP.y=StartP.y+1;
lpPtr=(char *)lpImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;
if(*lpPtr!=0){
CurP.x=StartP.x;
CurP.y=StartP.y+1;
}
else{
CurP.x=StartP.x-1;
CurP.y=StartP.y+1;
}
}
while (! ( (CurP.x==StartP.x) &&(CurP.y==StartP.y))){
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;
*lpTempPtr=(unsigned char)0;
for(i=0;i<8;i++){
x=CurP.x+direct[i][0];
y=CurP.y+direct[i][1];
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;
if( ( (*lpPtr==0)&&(*lpTempPtr!=0) ) || ( (x==StartP.x) &&(y==StartP.y)))
if(IsContourP(x,y,lpPtr)){
CurP.x=x;
CurP.y=y;
break;
}
}
}
}
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:\\contour.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;
}
////////////////////////////////////////////////////////////////
BOOL IsContourP(LONG x,LONG y, char *lpPtr)
{
int num,n,w,e,s;
n=(unsigned char)*(lpPtr+LineBytes);
w=(unsigned char)*(lpPtr-1);
e=(unsigned char)*(lpPtr+1);
s=(unsigned char)*(lpPtr-LineBytes);
num=n+w+e+s;
if(num==0)
return FALSE;
return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL SeedFill(HWND hWnd)
{
DWORD BufSize;
LPBITMAPINFOHEADER lpImgData;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr,lpTempPtr1;
HDC hDc;
HFILE hf;
POINT CurP,NeighborP;
if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
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);
//copy image data
memcpy(lpTempImgData,lpImgData,BufSize);
if(!InitStack(hWnd,(LONG)bi.biHeight*bi.biWidth)){
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return FALSE;
}
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-SeedPoint.y*LineBytes)+SeedPoint.x;
if(*lpTempPtr==0){
MessageBox(hWnd,"The point you select is a contour point!","Error Message",MB_OK|MB_ICONEXCLAMATION);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
DeInitStack();
return FALSE;
}
MyPush(SeedPoint);
while(!IsStackEmpty())
{
CurP=MyPop();
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-CurP.y*LineBytes)+CurP.x;
*lpTempPtr=(unsigned char)0;
//left neighbour
if(CurP.x>0)
{
NeighborP.x=CurP.x-1;
NeighborP.y=CurP.y;
lpTempPtr1=lpTempPtr-1;
if(*lpTempPtr1!=0)
MyPush(NeighborP);
}
//up neighbour
if(CurP.y>0)
{
NeighborP.x=CurP.x;
NeighborP.y=CurP.y-1;
lpTempPtr1=lpTempPtr+LineBytes;
if(*lpTempPtr1!=0)
MyPush(NeighborP);
}
//right neighbour
if(CurP.x<bi.biWidth-1)
{
NeighborP.x=CurP.x+1;
NeighborP.y=CurP.y;
lpTempPtr1=lpTempPtr+1;
if(*lpTempPtr1!=0)
MyPush(NeighborP);
}
//down neighbour
if(CurP.y<bi.biHeight-1)
{
NeighborP.x=CurP.x;
NeighborP.y=CurP.y+1;
lpTempPtr1=lpTempPtr-LineBytes;
if(*lpTempPtr1!=0)
MyPush(NeighborP);
}
}
DeInitStack();
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:\\seed.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;
}
////////////////////////////////////////////////////////////////
BOOL InitStack(HWND hWnd,LONG StackLen)
{
SeedFillStack.ElementsNum=StackLen;
if((SeedFillStack.hMem=GlobalAlloc(GHND,SeedFillStack.ElementsNum*sizeof(POINT)))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","ErrorMessage",MB_OK|
MB_ICONEXCLAMATION);
return FALSE;
}
SeedFillStack.lpMyStack=(POINT *)GlobalLock(SeedFillStack.hMem);
memset(SeedFillStack.lpMyStack,0,SeedFillStack.ElementsNum*sizeof(POINT));
SeedFillStack.ptr=0;
return TRUE;
}
////////////////////////////////////////////////////////////////
void DeInitStack()
{
GlobalUnlock(SeedFillStack.hMem);
GlobalFree(SeedFillStack.hMem);
SeedFillStack.ElementsNum=0;
SeedFillStack.ptr=0;
}
////////////////////////////////////////////////////////////////
BOOL MyPush(POINT p)
{
POINT *TempPtr;
if(SeedFillStack.ptr>=SeedFillStack.ElementsNum)
return FALSE;
TempPtr=(POINT *)(SeedFillStack.lpMyStack+SeedFillStack.ptr++);
(*TempPtr).x=p.x;
(*TempPtr).y=p.y;
return TRUE;
}
////////////////////////////////////////////////////////////////
POINT MyPop()
{
POINT InvalidP;
InvalidP.x=-1;
InvalidP.y=-1;
if(SeedFillStack.ptr<=0)
return InvalidP;
SeedFillStack.ptr--;
return *(SeedFillStack.lpMyStack+SeedFillStack.ptr);
}
////////////////////////////////////////////////////////////////
BOOL IsStackEmpty()
{
return (SeedFillStack.ptr==0)?TRUE:FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -