求算法(90分)

  • 主题发起人 主题发起人 金少
  • 开始时间 开始时间

金少

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样取一副方形图的中心为园心, 以自定义r为半径, 画园!
要求保持园内图像, 将园外的图像改为白色?
有没有好的方法? 多多指教! Tks !
 
这用不着什么算法吧!直接计算就是了。
你动手试试,很快就可以搞定,估计你是一直在想如何如何更简单点。
 
内建一个位图,底色为白色,然后画一个中心为园心r为半径的黑色的园,然后对
这两幅图进行按位或操作,相当于一个蒙板。这样速度较快,但需要额外的资源。
 
有更详细的代码吗?重要的是速度一定要快!
 
请高手多教, 急!
 
我用两个 TImage 实现了,以下是代码,马上给出详细说明。

procedure TForm1.Button1Click(Sender: TObject);
var
arect:TRect;
begin
ARect := Rect(0, 0, m1.Width, m2.Height);
m1.Canvas.brush.color:=$ff0000;
m1.Canvas.FillRect(ARect);

m2.Canvas.brush.color:=$ffffff;
m2.Canvas.FillRect(ARect);
m2.Canvas.brush.style:=bsclear;
m2.Canvas.brush.color:=$000000;
m2.Canvas.Ellipse(ARect);

with m1.Canvas do
begin
CopyMode := cmSrcPaint ;
CopyRect(ARect, m2.Canvas, ARect);
CopyMode := cmSrcCopy; { restore the copy mode }
end;

end;
 
//帮你做了一个过程
procedure EllipseArea(Dest,Src:TBitmap;X,Y,R:Integer);
begin
Dest.Assign(Src);
Src.Canvas.Pen.Color:=clWhite;
Src.Canvas.Ellipse(X-R,Y-R,X+R,Y+R);
//以下的copy图像模式最为关键
Bitblt(Dest.Canvas.Handle,0,0,Dest.Width,Dest.Height,Src.Canvas.Handle,0,0,MERGEPAINT);
end;
dest 为目标图像
src 为源图像
x,y 为圆心坐标 r为半径
 
m1,m2 是两个一样大的TImage。
m1中可以放置你的图像,我这里只是用蓝色填充。
m2在运行时可隐藏(visible:=false)。只是为了在里面画一个 Mask。

关键在于 Mask怎么画,以及如何叠加。

在 m2 中先用 白色填充($FFFFFF),然后用黑色($000000)画所需要的圆。
然后将 m1 和 m2 中的图像施行 ( OR 操作),这在使用 CopyRect时,由
CopyMode := cmSrcCopy 体现。

和白色 OR 变成白色,和黑色 OR 保持不变。

要找出中心点画任意圆应该不成问题。
 
楼上的想法一样
 
我没有代码,给你一个方法吧,
先建立一个圆形区域,再建立一个矩形区域,再用区域合并,得到新区域。
用draw画出图像。
有空的话我做一源程序给你。
 
多人接受答案了。
 
后退
顶部