矩形的我知道用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;
显示打开一个图像文件。当用户选择一个图像文件之后,他可以选择图像的一个小区域但是程序中需要用跟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;
用到几个API,解释看这里:http://www.cnblogs.com/del/archive/2008/05/23/1206126.html
套索请google “图像边缘检测”。
http://vis.berkeley.edu/papers/softscissors/
http://sweb.cityu.edu.hk/hongbofu/projects/LazySelection_SigA12/
http://blog.csdn.net/luckyboy101/article/details/8604139