MYLINE IpMyLine, TempLine, MaxdLine tic hogPeN rlp=(PS SOLID, 1, 1, RGB(255,0,0)1 HEN ∥我们处理的实际上是256级灰度图,不过只用到了0和255两种颜色。 if( Num Colors!=256)1 Message Box(hWnd, "Must be a mono bitmap with grayscale palette Error Message", MB OKMB ICONEXCLAMATION) return False ∥计算最大距离 Dist=(int (sqrt((double)bi. biwidth*bi bi Width+ (double)bi. biHeight*bi. biHeight)+0.5) Alpha=180/2;∥0到to178度,步长为2度 ∥距离角度数组分配内存 f((hDist Alpha=GlobalAlloc(GHnd, (DWORD)Dist*Alpha* sizeof(int)))=NULL)( Message Box(hWnd, Error alloc memory! " "Error Message" MB OKJMB ICONEXCLAMATION) return False ∥.记录直线端点的数组分配内存 if(hMyLine=GlobalAlloc( GHND, (DWORDDist*Alpha* sizeof(MYLINEDD)==NULL)i return false OffBitsbf. bfOffBits-sizeof(BITMAPFILEHEADER) upSize为缓冲区大小 BufSize=offBits+bi bi Height* Line Bytes Iplmg Data=(LPBITMAPINFOHEADER)GlobalLock(hlmg Data) IpDist alpha=(int)GlobalLock(hDistAlpha) IpMyline=( for(i=0; i<(long)Dist"Alpha, 1++) TempLine=( MYLINE*)(pMyLine-+i); (* Templin),boty=32767,∥初始化最低点的y坐标为一个很大的值 for(y=0; y<bi bi Height; y++)i pPur指向位图数据
MYLINE *lpMyLine,*TempLine,MaxdLine; static LOGPEN rlp={PS_SOLID,1,1,RGB(255,0,0)}; HPEN rhp; //我们处理的实际上是 256 级灰度图,不过只用到了 0 和 255 两种颜色。 if( NumColors!=256){ MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!", "Error Message",MB_OK|MB_ICONEXCLAMATION); return FALSE; } //计算最大距离 Dist=(int)(sqrt((double)bi.biWidth*bi.biWidth+ (double)bi.biHeight*bi.biHeight)+0.5); Alpha=180 /2 ; //0 到 to 178 度,步长为 2 度 //为距离角度数组分配内存 if((hDistAlpha=GlobalAlloc(GHND,(DWORD)Dist*Alpha* sizeof(int)))==NULL){ MessageBox(hWnd,"Error alloc memory!","Error Message", MB_OK|MB_ICONEXCLAMATION); return FALSE; } //为记录直线端点的数组分配内存 if((hMyLine=GlobalAlloc(GHND,(DWORD)Dist*Alpha* sizeof(MYLINE)))==NULL){ GlobalFree(hDistAlpha); return FALSE; } OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); //BufSize 为缓冲区大小 BufSize=OffBits+bi.biHeight*LineBytes; lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpDistAlpha=(int *)GlobalLock(hDistAlpha); lpMyLine=(MYLINE *)GlobalLock(hMyLine); for (i=0;i<(long)Dist*Alpha;i++){ TempLine=(MYLINE*)(lpMyLine+i); (*TempLine).boty=32767; //初始化最低点的 y 坐标为一个很大的值 } for (y=0;y<bi.biHeight;y++){ //lpPtr 指向位图数据
IpPtr=(char *)lplmg Data+(BufSize-LineBytes-y*Line Bytes) for(x=0; X<bi bi Width, x++) if(*(lpP+)=0)∥是个黑点 for(k=0k<180;k+=2){ ∥计算距离i i=(long)fabs(x*cos(k *P1/180.0)+y*sin(k*Pl/180.0))) ∥相应的数组元素加1 *(Ip Alpha+i*Alpha+/2)*(lpDistAlphai*Alpha+k/2)+1 TempLine=(MYLINE*)(pMy Line+i*Alpha+k/2) if(y>("*TempLine) topy)i 记录该直线最高点的x,y坐标 *TempLin).topx-x, (TempLin). topy=y if(y<(*TempLine) boty)4 记录该直线最低点的xy坐标 (Te for(i=0; i<(long) Dist*Alpha; i++)i Templine=( MYlINE*(pMyline+i) k=*( Alpha+1) f(k> maxd) ∥找到数组元素中最大的,及相应的直线端点 MaxdLine. topx=("TempLine)topx MaxdLine. topy=(*TempLine) topy MaxdLine. botx=("TempLine) botx Line. boty=( TempLine hDc= GetDC(hwnd) rhp= CreatePenIndirect(&rlp) MoveToEx(hDc, MaxdLine botx, MaxdLine. boty, NULL
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes); for (x=0;x<bi.biWidth;x++) if(*(lpPtr++)==0) //是个黑点 for (k=0;k<180;k+=2){ //计算距离 i i=(long)fabs((x*cos(k*PI/180.0)+y*sin(k*PI/180.0))); //相应的数组元素加 1 *(lpDistAlpha+i*Alpha+k/2)=*(lpDistAlpha+i*Alpha+k/2)+1; TempLine=(MYLINE*)(lpMyLine+i*Alpha+k/2); if(y> (*TempLine).topy){ //记录该直线最高点的 x,y 坐标 (*TempLine).topx=x; (*TempLine).topy=y; } if(y< (*TempLine).boty){ //记录该直线最低点的 x,y 坐标 (*TempLine).botx=x; (*TempLine).boty=y; } } } maxd=0; for (i=0;i<(long)Dist*Alpha;i++){ TempLine=(MYLINE*)(lpMyLine+i); k=*(lpDistAlpha+i); if(k > maxd){ //找到数组元素中最大的,及相应的直线端点 maxd=k; MaxdLine.topx=(*TempLine).topx; MaxdLine.topy=(*TempLine).topy; MaxdLine.botx=(*TempLine).botx; MaxdLine.boty=(*TempLine).boty; } } hDc = GetDC(hWnd); rhp = CreatePenIndirect(&rlp); SelectObject(hDc,rhp); MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL);