|

楼主 |
发表于 2005-9-30 13:27:42
|
显示全部楼层
最终解决方案 <BR><BR> 考虑到既不增加<A class=article href="http://school.enet.com.cn/eschool/includes/zhuanti/shuyu/info/4/19/1319.shtml" target="_blank" ><FONT color=#000000>算法</FONT></A>的复杂度,又可大幅度缩短不规则窗体的创建<A class=article href="http://school.enet.com.cn/eschool/includes/zhuanti/shuyu/info/2/09/217.shtml" target="_blank" ><FONT color=#000000>速度</FONT></A>,因此采用综合以上两种方案,达到我们应用的目的,程序中首先应用方法二对图片双向<A class=article href="http://school.enet.com.cn/eschool/includes/zhuanti/shuyu/info/8/04/2499.shtml" target="_blank" ><FONT color=#000000>扫描</FONT></A>,产生轮廓坐标点数组,然后在图片轮廓内应用方法一将内凹部分抠去,最后才用多边形区域创建函数抠去图片外围部分。程序如下: <BR><BR> void __fastcall TForm1::FormCreate(TObject *Sender) <BR><BR> { <BR> <BR> register int x,y; <BR><BR> int l,r; <BR><BR> POINT *a; <BR><BR> bool lb,rb; <BR><BR> HRGN WndRgn,TempRgn,tepRgn; <BR><BR> Width=800;Height=600; <BR><BR> if((a=(POINT *)malloc(800*4*(sizeof(POINT))))==NULL) <BR><BR> { <BR><BR> ShowMessage("申请<A class=article href="http://school.enet.com.cn/eschool/includes/zhuanti/shuyu/info/1/02/131.shtml" target="_blank" ><FONT color=#000000>内存</FONT></A>失败!"); <BR><BR> exit(0); <BR><BR> } <BR><BR> Image1-> icture->LoadFromFile(".\\face.bmp"); <BR><BR> Width=Image1->Width; <BR><BR> Height=Image1->Height; <BR><BR> Repaint(); <BR><BR> l=0;r=Image1->Height*2-1; <BR><BR> WndRgn=CreateRectRgn(0,0,Image1->Width,Image1->Height); <BR><BR> < //应用方法二产生轮廓坐标点数组 <BR><BR> for(y=0;y<IMAGE1->Height;y++) <BR><BR> { <BR><BR> lb=true; <BR><BR> for(x=0;x<IMAGE1->Width;x++) <BR><BR> if(Image1->Canvas-><A class=article href="http://school.enet.com.cn/eschool/includes/zhuanti/shuyu/info/6/01/1456.shtml" target="_blank" ><FONT color=#000000> ixel</FONT></A>s[x][y]!=clWhite) <BR><BR> { <BR><BR> a[l].x=x+1; <BR><BR> a[l].y=y; <BR><BR> lb=false; <BR><BR> break; <BR><BR> } <BR><BR> if(lb) a[l]=a[l-1]; <BR><BR> l++; <BR><BR> rb=true; <BR><BR> for(x=Image1->Width-1;x>=0;x--) <BR><BR> if(Image1->Canvas-> ixels[x][y]!=clWhite) <BR><BR> { <BR><BR> a[r].x=x; <BR><BR> a[r].y=y; <BR><BR> rb=false; <BR><BR> break; <BR><BR> } <BR><BR> if(rb) a[r]=a[r+1]; <BR><BR> r--; <BR><BR> } <BR><BR> //应用方法一抠去图片内凹部分 <BR><BR> r=Image1->Height*2-1; <BR><BR> for(y=0;y<IMAGE1->Height;y++){ <BR><BR> for(x=a[y].x;x<A[R].X;X++) <br /> <BR> if(Image1->Canvas-> ixels[x][y]==clWhite) <BR><BR> { <BR><BR> < tepRgn=CreateRectRgn(x,y,x+1,y+1); <BR><BR> CombineRgn(WndRgn,WndRgn,tepRgn,RGN_XOR); <BR><BR> DeleteObject(tepRgn); <BR><BR> } <BR><BR> r--; <BR><BR> } <BR><BR> //将图片外围部分抠去 <BR><BR> TempRgn=CreatePolygonRgn(a,Image1->Height*2,ALTERNATE); <BR><BR> CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND); <BR><BR> DeleteObject(TempRgn); <BR><BR> free(a); <BR><BR> //显示不规则窗体 <BR><BR> SetWindowRgn(Handle,WndRgn,true); <BR><BR> SetWindowPos(Handle,HWND_TOP,0,0,0,0,SWP_NO<A class=article href="http://school.enet.com.cn/eschool/includes/zhuanti/shuyu/info/12/04/609.shtml" target="_blank" ><FONT color=#000000>MO</FONT></A>VE SWP_NOSIZE); <BR><BR> } <BR><BR> 至此,一个漂亮的程序界面就出现在你的屏幕上了。 |
|