矩形的我知道用CDC -- DrawDragRect
显示打开一个图像文件。当用户选择一个图像文件之后,他可以选择图像的一个小区域但是程序中需要用跟PS一样的索套工具,鼠标经过后,自动判断路径的闭合区域,然后再画蚂蚁线,
再将选中区域的图像拷贝出来,
蚂蚁线比较好画,关键是如何通过鼠标经过的点,获取这块闭合区域,其实也就是不规则形状...
有DELPHI的代码但我看不懂Delphi/Pascal code
?

...
  private
    FPoints: array of TPoint;
    FMouseDown: Boolean;
...
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  Rgn: HRGN;
begin
  with PaintBox1 do
  if Length(FPoints) > 0 then
  begin
    BeginPath(Canvas.Handle);
      Polyline(Canvas.Handle, FPoints[0], Length(FPoints));
    EndPath(Canvas.Handle);
    //Rgn := PathToRegion(Canvas.Handle);
    if not FMouseDown then
      SelectClipPath(Canvas.Handle, RGN_COPY);
    Canvas.Draw(0, 0, Image1.Picture.Bitmap);
    Canvas.Pen.Style := psDot;
    StrokePath(Canvas.Handle);
  end
  else
    Canvas.Draw(0, 0, Image1.Picture.Bitmap);
end;
 
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SetLength(FPoints, 0);
  FMouseDown := True;
end;
 
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
  begin
    SetLength(FPoints, Length(FPoints) + 1);
    FPoints[High(FPoints)] := Point(X, Y);
    Refresh;
  end;
end;
 
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FMouseDown := False;
  PaintBox1.Refresh;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
end;

解决方案 »

  1.   

    没人知道PASCAL语言么,噶噶里
      

  2.   

    你贴的delphi代码没有“套索”功能,它只是对鼠标拖动的路径建立一个区域。
    用到几个API,解释看这里:http://www.cnblogs.com/del/archive/2008/05/23/1206126.html
    套索请google “图像边缘检测”。
      

  3.   

    魔术棒的效果不好,看看这些
    http://vis.berkeley.edu/papers/softscissors/
    http://sweb.cityu.edu.hk/hongbofu/projects/LazySelection_SigA12/
    http://blog.csdn.net/luckyboy101/article/details/8604139
      

  4.   

    不是魔术棒啊,是套索工具,PHOTOSHOP的那个