(100分)怎么样得到在CANVAS中画了一幅图后,得到一个这个图的轮廓路径(看我的哪里有错)(100分)

  • 主题发起人 主题发起人 ohyee
  • 开始时间 开始时间
O

ohyee

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.FormCreate(Sender: TObject);
var
rgn:HRGN;
begin
BeginPath(Canvas.Handle);
SetBkMode( Canvas.Handle, TRANSPARENT );
Canvas.Draw(1,1,Image1.Picture.Graphic);//我在窗口中加了一个TIMAGE控件
EndPath(Canvas.Handle);
CloseFigure(Canvas.Handle);//如果我不加此行就会出超出内存错误,加上则提示不能完成;
rgn:= PathToRegion(Canvas.Handle);
SetWindowRgn( Handle, rgn, true );
end;

 
CloseFigure 放到 EndPath 前面???????????
 
to: szchengyu
这样不行。。 CloseFigure要求一个已经关闭的路径。
 
哦,你的PATH不能这样作,PATH只能适用绘图函数,见帮助:

AngleArc LineTo Polyline
Arc MoveToEx PolylineTo
ArcTo Pie PolyPolygon
Chord PolyBezier PolyPolyline
CloseFigure PolyBezierTo Rectangle
Ellipse PolyDraw RoundRect
ExtTextOut Polygon TextOut

你需要以下过程实现
function CreateRgnFromBmp(bmp: TBitmap): HRGN;
var
offbyte, lineaddress: integer;
isline: boolean;
cx, cy, x, y: integer;
bitcolor: byte;
begin
cx := 0;
cy := 0;
with bmp, bmp.Canvas do
begin
monochrome := true;
pixelformat := pf1bit;
BeginPath(handle);
for y := 0 to height - 1 do
begin
lineaddress := longint(scanline[y]);
isline := false;
for x := 0 to width - 1 do
begin
offbyte := (x shr 3); // x div 8
bitcolor := ((pbyte(lineaddress + offbyte)^ shl
(x - (offbyte shl 3))) and $80);
if bitcolor = 0 then
begin
if not isline then
begin
isline := true;
cx := x;
cy := y;
end;
if x = width - 1 then
begin
moveto(cx, cy);
lineto(width, cy);
lineto(width, cy + 1);
lineto(cx, cy + 1);
CloseFigure(handle);
end;
end
else if isline then
begin
isline := false;
moveto(cx, cy);
lineto(x, cy);
lineto(x, cy + 1);
lineto(cx, cy + 1);
CloseFigure(handle);
end;
end;
end;
EndPath(handle);
result := PathtoRegion(Handle);
end;
end;
 
试试下面代码:在form.creat中调用shape函数
TForm1::shape(TImage* a)
{HRGN r1,r2;
int x,y,s,e;
TColor a0;

a0=a->Canvas->Pixels[0][0];
r1=CreateRectRgn(0,0,0,0);
for (y=1;y<=a->Height;y++) //
{
x=0;s=0;e=0;
//do
while (x<=a->Width)
{x=x+1;
while ((a->Canvas->Pixels[x][y]==a0)&amp;&amp;(x<a->Width))
x=x+1;
s=x;
while ((a->Canvas->Pixels[x][y]!=a0)&amp;&amp;(x<a->Width))
x=x+1;
e=x;

if (s<=e)
{
r2=CreateRectRgn(s,y,e,y+1);
CombineRgn(r1,r1,r2,RGN_OR);
}
}//do
// while (x>a->Width);
}//for
DeleteObject(r2) ;
SetWindowRgn(Handle,r1,true);
return(true);
}
 
感谢SZCHENYU,ZJXXLN。
昨天下午我自己已经找到得到图片的轮廓的方法,具体跟SZCHENYU兄做法差不多,但是加
了能够剔除某种色彩的功能。
现在为两位加各加上50分。:)
 
后退
顶部