<p>关于细化算法</p><p><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><font face="宋体, MS Song">//</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥;">图像细化算法</span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><font face="宋体, MS Song"> </font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥;">为什么</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><font face="宋体, MS Song"> num=nw/255+n/255*2+ne/255*4+w/255*8+e/255*16+sw/255*32+s/255*64+se/255*128;<br/><br/>BOOL Thinning(HWND hWnd)<br/>{<br/>DWORD BufSize;<br/>LPBITMAPINFOHEADER lpImgData;<br/>LPSTR lpPtr;<br/>HLOCAL hTempImgData;<br/>LPBITMAPINFOHEADER lpTempImgData;<br/>LPSTR lpTempPtr;<br/>HDC hDc;<br/>HFILE hf;<br/>LONG x,y;<br/>int num;<br/>BOOL Finished;<br/>int nw,n,ne,w,e,sw,s,se;<br/>static int erasetable[256]={<br/>0,0,1,1,0,0,1,1,<br/>1,1,0,1,1,1,0,1,<br/>1,1,0,0,1,1,1,1,<br/>0,0,0,0,0,0,0,1,<br/><br/>0,0,1,1,0,0,1,1,<br/>1,1,0,1,1,1,0,1,<br/>1,1,0,0,1,1,1,1,<br/>0,0,0,0,0,0,0,1,<br/><br/>1,1,0,0,1,1,0,0,<br/>0,0,0,0,0,0,0,0,<br/>0,0,0,0,0,0,0,0,<br/>0,0,0,0,0,0,0,0,<br/><br/>1,1,0,0,1,1,0,0,<br/>1,1,0,1,1,1,0,1,<br/>0,0,0,0,0,0,0,0,<br/>0,0,0,0,0,0,0,0,<br/><br/>0,0,1,1,0,0,1,1,<br/>1,1,0,1,1,1,0,1,<br/>1,1,0,0,1,1,1,1,<br/>0,0,0,0,0,0,0,1,<br/><br/>0,0,1,1,0,0,1,1,<br/>1,1,0,1,1,1,0,1,<br/>1,1,0,0,1,1,1,1,<br/>0,0,0,0,0,0,0,0,<br/><br/>1,1,0,0,1,1,0,0,<br/>0,0,0,0,0,0,0,0,<br/>1,1,0,0,1,1,1,1,<br/>0,0,0,0,0,0,0,0,<br/><br/>1,1,0,0,1,1,0,0,<br/>1,1,0,1,1,1,0,0,<br/>1,1,0,0,1,1,1,0,<br/>1,1,0,0,1,0,0,0<br/>};<br/><br/>if( NumColors!=256){<br/>MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);<br/>return FALSE;<br/>}<br/>BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);<br/>if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)<br/>{<br/>MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);<br/>return FALSE;<br/>}<br/>lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); <br/>lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);<br/>//copy image data<br/>memcpy(lpTempImgData,lpImgData,BufSize);<br/><br/>Finished=FALSE;<br/>while(!Finished){<br/>Finished=TRUE;<br/>for (y=1;y<bi.biHeight-1;y++){ <br/>lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);<br/>lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);<br/>x=1; <br/>while(x<bi.biWidth-1){<br/>if(*(lpPtr+x)==0){<br/>w=(unsigned char)*(lpPtr+x-1);<br/>e=(unsigned char)*(lpPtr+x+1);<br/>if( (w==255)|| (e==255)){<br/>nw=(unsigned char)*(lpPtr+x+LineBytes-1);<br/>n=(unsigned char)*(lpPtr+x+LineBytes);<br/>ne=(unsigned char)*(lpPtr+x+LineBytes+1);<br/>sw=(unsigned char)*(lpPtr+x-LineBytes-1);<br/>s=(unsigned char)*(lpPtr+x-LineBytes);<br/>se=(unsigned char)*(lpPtr+x-LineBytes+1);<br/>num=nw/255+n/255*2+ne/255*4+w/255*8+e/255*16+sw/255*32+s/255*64+se/255*128;<br/>if(erasetable[num] == 1)<br/>{<br/>*(lpPtr+x)=(BYTE)255;<br/>*(lpTempPtr+x)=(BYTE)255;<br/>Finished=FALSE;<br/>x++;<br/>}<br/>}<br/>}<br/>x++;<br/>}<br/>}<br/><br/>for (x=1;x<bi.biWidth-1;x++){ <br/>y=1;<br/>while(y<bi.biHeight-1){<br/>lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);<br/>lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);<br/>if(*(lpPtr+x)==0){<br/>n=(unsigned char)*(lpPtr+x+LineBytes);<br/>s=(unsigned char)*(lpPtr+x-LineBytes);<br/>if( (n==255)|| (s==255)){<br/>nw=(unsigned char)*(lpPtr+x+LineBytes-1);<br/>ne=(unsigned char)*(lpPtr+x+LineBytes+1);<br/>w=(unsigned char)*(lpPtr+x-1);<br/>e=(unsigned char)*(lpPtr+x+1);<br/>sw=(unsigned char)*(lpPtr+x-LineBytes-1);<br/>se=(unsigned char)*(lpPtr+x-LineBytes+1);<br/>num=nw/255+n/255*2+ne/255*4+w/255*8+e/255*16+sw/255*32+s/255*64+se/255*128;<br/>if(erasetable[num]==1){<br/>*(lpPtr+x)=(BYTE)255;<br/>*(lpTempPtr+x)=(BYTE)255;<br/>Finished=FALSE;<br/>y++;<br/>}<br/>}<br/>}<br/>y++;<br/>}<br/>} <br/>}<br/><br/>if(hBitmap!=NULL)<br/>DeleteObject(hBitmap);<br/>hDc=GetDC(hWnd); <br/>hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,<br/>(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),<br/>(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);<br/><br/>hf=_lcreat("c:\\thinning.bmp",0);<br/>_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); <br/>_lwrite(hf,(LPSTR)lpTempImgData,BufSize);<br/>_lclose(hf);<br/><br/>ReleaseDC(hWnd,hDc);<br/>LocalUnlock(hTempImgData);<br/>LocalFree(hTempImgData);<br/>GlobalUnlock(hImgData);<br/>return TRUE;<br/>}</font></span></p>
+ S) Y0 @/ r. e X[此贴子已经被作者于2006-6-15 11:29:07编辑过] |