Delphi中怎样编程实现类似photoshop里的画笔工具的画线效果,该怎么解决
Delphi中怎样编程实现类似photoshop里的画笔工具的画线效果
相信大家都用过photoshop,画线有铅笔和画笔2种工具,我现在想实现的是画笔的那种效果,也就是笔触比较柔和,线条边缘平滑一点(完全的消除锯齿难度也太高了 ^_^)!
我现在的做法模仿photoshop中的那种点效果,也就是说比如画笔大小是设置成1像素的那么我就画一个3x3的正方形,中间的那个点我使用用户设置的颜色,其它的8个点的颜色则做了不同的减淡处理,现在用鼠标画出来的线条效果还可以,但是因为我是用Canvas.Pixels[x,y]来处理,555555555 结果可想而知,当画笔的大小设置得比较大时,慢的让人想哭!!
有没有做过类似功能的前辈请指点一下,或者有相关的控件,源码,网址也请帮忙推荐一下,拖了2个星期了,急死人了阿~~~
------解决方案--------------------
fillrect 填充一个四边形的区域 --通常用来做那种实心的正方形
Canvas.Ellipse(0,0,2r,2r); //r为半径---画圆
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing := True;
Image.Canvas.MoveTo(X, Y);
Origin := Point(X, Y);
MovePt := Origin;
StatusBar1.Panels[0].Text := Format('Origin: (%d, %d)', [X, Y]);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Drawing then
begin
DrawShape(Origin, Point(X, Y), pmCopy);
Drawing := False;
end;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Drawing then
begin
DrawShape(Origin, MovePt, pmNotXor);
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
end;
StatusBar1.Panels[1].Text := Format('Current: (%d, %d)', [X, Y]);
end;=======================================================================================画线
TCanvas对象的方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
方法名称 形式及说明
───────────────────────────────────────
Arc Arc(x1,y1,x2,y2,x3,y3,x4,y4 : Integer);
Arc方法在椭圆上画一段弧,椭圆由(x1,y1),(x2,y2) 两点所确定的椭圆所决
定。弧的起点是椭圆圆周和椭圆中心与(x3,y3)连线的交点。弧矩形终点是椭
圆圆周和椭圆中心与(x4,y4)连线的交点,以逆时针方向画弧。
Chord Chord(x1,y1,x2,yx,x3,y3,x4,y4 : Integer);
Chord方法连接椭圆上的两点,椭圆由(x1,y1),(x2,y3) 两点所确定的矩形决
定,(x3,y3)是始点,(x4,y4)是终点。
Brushcopy Brushcopy(const Dest : TRect;Bitmap : TBitmap;const Source TRect;
Color : TColor);
Brushcopy方法把位图的一部分复制到画布的某个矩形区域,并用画笔的当前颜色替换位图的颜色。参数Dest定义画布的一个矩形区域,该矩形用以填充位图,Bitmap定义位图;Source定义位图中的矩形区域,该区域上的位图
将被复制;Color定义画笔中,用以替换位图的颜色。
CopyRect CopyRect(Dest : TRect;Canvas : TCanvas; Source TRect);
此方法从另一个画布对象上复制部分图像到该画布。Canvas表示源画布,Source是源画布上要复制的图像区域。Dest表示目标画布上将接受复制
图像的矩形区域。
Draw Draw(x,y : Integer;Graphic : TGraphic) ;
此方法在画布给定的象素点坐标(x,y) 处画Graphic所给的图像,该图像可以是位图,图标或元位图。
Ellips Ellips(x1,y1,x2,y2 : Integer);
Ellips方法在画布指定的矩形边界上画一个椭圆,(x1,y1)是矩形左上角的象素坐标,x2,y2是矩形右下角的象素坐标。如果矩形形成一个区域,将出现一个椭圆。
LineTo LineTo(x,y : Integer);
LineTo从当前位置画一条线至(x,y)所指定的位置,并把笔的位置移至(x ,y) 。
MoveTo MoveTo(x,y : Integer);
MoveTo 将笔的当前位置设置到点(x,y) 处,笔的当前位置在PenPos属性中,
改变笔的当前位置使用MoveTo方法,不要设法改变PenPos的值。
Die Die(x1,y1,x2,y2,x3,y3,x4,y4 : Longint);
Die方法绘制椭圆的一部分,椭圆由点(x1,y1),(x2,y2)所指定的矩形所决定,制的那部分由椭圆中心到(x3,y3),(x4,y4)两点的两条辐射线所决定。
Polygon Polygon(Points : array of TPrint);
Polygon方法在画布上绘制一系列的点,各点依次连成线,最后将首尾两点相接形成一个区域,并用当前笔刷填充此区域。
Polyline Polyline(Ports : array of TPort);
Polyline方法在画布上用当前画笔绘制一系列的点,各点依次连成线。
StretchDraw StretchDraw(Const Rect : TRcct : Graphic : TGraphic);
此方法在Rect参数指定的矩形内画一图像。图像延伸改变大小以适应矩形。
Rectangle Rectangle(X1,y1,x2,y2 : Integer);
Rectangle方法在画布上用当前画刷绘制矩形,(x1,y1)是矩形的左上角,(x2,y2)是矩形的右下角。
RomlRect RomlRect((x1,y1,x2,y2,x3,y3, : Integer);
DrawFocuseRect
相信大家都用过photoshop,画线有铅笔和画笔2种工具,我现在想实现的是画笔的那种效果,也就是笔触比较柔和,线条边缘平滑一点(完全的消除锯齿难度也太高了 ^_^)!
我现在的做法模仿photoshop中的那种点效果,也就是说比如画笔大小是设置成1像素的那么我就画一个3x3的正方形,中间的那个点我使用用户设置的颜色,其它的8个点的颜色则做了不同的减淡处理,现在用鼠标画出来的线条效果还可以,但是因为我是用Canvas.Pixels[x,y]来处理,555555555 结果可想而知,当画笔的大小设置得比较大时,慢的让人想哭!!
有没有做过类似功能的前辈请指点一下,或者有相关的控件,源码,网址也请帮忙推荐一下,拖了2个星期了,急死人了阿~~~
------解决方案--------------------
fillrect 填充一个四边形的区域 --通常用来做那种实心的正方形
Canvas.Ellipse(0,0,2r,2r); //r为半径---画圆
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing := True;
Image.Canvas.MoveTo(X, Y);
Origin := Point(X, Y);
MovePt := Origin;
StatusBar1.Panels[0].Text := Format('Origin: (%d, %d)', [X, Y]);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Drawing then
begin
DrawShape(Origin, Point(X, Y), pmCopy);
Drawing := False;
end;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Drawing then
begin
DrawShape(Origin, MovePt, pmNotXor);
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
end;
StatusBar1.Panels[1].Text := Format('Current: (%d, %d)', [X, Y]);
end;=======================================================================================画线
TCanvas对象的方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
方法名称 形式及说明
───────────────────────────────────────
Arc Arc(x1,y1,x2,y2,x3,y3,x4,y4 : Integer);
Arc方法在椭圆上画一段弧,椭圆由(x1,y1),(x2,y2) 两点所确定的椭圆所决
定。弧的起点是椭圆圆周和椭圆中心与(x3,y3)连线的交点。弧矩形终点是椭
圆圆周和椭圆中心与(x4,y4)连线的交点,以逆时针方向画弧。
Chord Chord(x1,y1,x2,yx,x3,y3,x4,y4 : Integer);
Chord方法连接椭圆上的两点,椭圆由(x1,y1),(x2,y3) 两点所确定的矩形决
定,(x3,y3)是始点,(x4,y4)是终点。
Brushcopy Brushcopy(const Dest : TRect;Bitmap : TBitmap;const Source TRect;
Color : TColor);
Brushcopy方法把位图的一部分复制到画布的某个矩形区域,并用画笔的当前颜色替换位图的颜色。参数Dest定义画布的一个矩形区域,该矩形用以填充位图,Bitmap定义位图;Source定义位图中的矩形区域,该区域上的位图
将被复制;Color定义画笔中,用以替换位图的颜色。
CopyRect CopyRect(Dest : TRect;Canvas : TCanvas; Source TRect);
此方法从另一个画布对象上复制部分图像到该画布。Canvas表示源画布,Source是源画布上要复制的图像区域。Dest表示目标画布上将接受复制
图像的矩形区域。
Draw Draw(x,y : Integer;Graphic : TGraphic) ;
此方法在画布给定的象素点坐标(x,y) 处画Graphic所给的图像,该图像可以是位图,图标或元位图。
Ellips Ellips(x1,y1,x2,y2 : Integer);
Ellips方法在画布指定的矩形边界上画一个椭圆,(x1,y1)是矩形左上角的象素坐标,x2,y2是矩形右下角的象素坐标。如果矩形形成一个区域,将出现一个椭圆。
LineTo LineTo(x,y : Integer);
LineTo从当前位置画一条线至(x,y)所指定的位置,并把笔的位置移至(x ,y) 。
MoveTo MoveTo(x,y : Integer);
MoveTo 将笔的当前位置设置到点(x,y) 处,笔的当前位置在PenPos属性中,
改变笔的当前位置使用MoveTo方法,不要设法改变PenPos的值。
Die Die(x1,y1,x2,y2,x3,y3,x4,y4 : Longint);
Die方法绘制椭圆的一部分,椭圆由点(x1,y1),(x2,y2)所指定的矩形所决定,制的那部分由椭圆中心到(x3,y3),(x4,y4)两点的两条辐射线所决定。
Polygon Polygon(Points : array of TPrint);
Polygon方法在画布上绘制一系列的点,各点依次连成线,最后将首尾两点相接形成一个区域,并用当前笔刷填充此区域。
Polyline Polyline(Ports : array of TPort);
Polyline方法在画布上用当前画笔绘制一系列的点,各点依次连成线。
StretchDraw StretchDraw(Const Rect : TRcct : Graphic : TGraphic);
此方法在Rect参数指定的矩形内画一图像。图像延伸改变大小以适应矩形。
Rectangle Rectangle(X1,y1,x2,y2 : Integer);
Rectangle方法在画布上用当前画刷绘制矩形,(x1,y1)是矩形的左上角,(x2,y2)是矩形的右下角。
RomlRect RomlRect((x1,y1,x2,y2,x3,y3, : Integer);
DrawFocuseRect