关于图像的剪切(200分)

  • 主题发起人 hhw_dxzx
  • 开始时间
H

hhw_dxzx

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位高手,我现在正在做一套系统,其中有一字段存放照片,我想把数码相机拍下的
图像只剪切图像的一部分(如脸部,尺寸固定,如同2寸照片一样的大小)剪切到相应的字段中,
如何进行剪切?要求首先打开图像,使图像显示在一窗口上,在图像上单击鼠标左键,将会出
大小固定的矩形剪切框(边框为动态),同时将矩形框内的图像剪切到存放照片的字段中。
 
可以把剪切的区域copy到剪切板ClipBoard.assign(bmp);并把相应的区域用白色填充
 
不懂。向上
 
COPY 框里的图像,和保存应该不是问题吧,我想难的可能是画那个流动的虚框,查了一下,
前面的贴子里,有这方面的提示,看看对你有否帮助:

Hunj (2000-9-5 14:29:00)
用delphi的ImageEditor是用选中工具在位图上画一个矩形,
会发现这个选中区域的边界的虚线是流动的,记得photoshop
也有同样的效果,请问怎么在程序中实现?

龙丹 (2000-9-5 19:33:00)
我刚好在一个报表编辑器中玩过这种东东。代码贴给你:
var
FFlowPointIndexBase:integer=0;
FCurrentRect:TRect;

procedure CanvasDrawFlowRect(Canvas:TCanvas);
var
PointIndex:integer;
procedure DrawFlowLine(X,Y,DeltaX,DeltaY,PointCount,PenColor:integer);
var
i:integer;
begin
for i:=0 to PointCount-1 do
begin
if Odd(PointIndex shr 2) then
Canvas.Pixels[X,Y]:=PenColor xor Canvas.Pixels[X,Y];
Inc(X,DeltaX);
Inc(Y,DeltaY);
Inc(PointIndex);
end;
end;
begin
with Canvas,FCurrentRect do
begin
Pen.Color:=Brush.Color;
PointIndex:=FFlowPointIndexBase;
DrawFlowLine(Left,Top,1,0,Right-Left,Pen.Color);
DrawFlowLine(Right,Top,0,1,Bottom-Top,Pen.Color);
DrawFlowLine(Right,Bottom,-1,0,Right-Left,Pen.Color);
DrawFlowLine(Left,Bottom,0,-1,Bottom-Top,Pen.Color);
end;
end;

procedure TRptPanel.TimerDrawMoveRect(Sender: TObject);
begin
CanvasDrawFlowRect(ParentPanel.Canvas);
Dec(FFlowPointIndexBase);
if FFlowPointIndexBase mod 8=0 then
FFlowPointIndexBase:=0;
CanvasDrawFlowRect(ParentPanel.Canvas);
end;

var
FDrawMoveRectFirst:boolean=True;

procedure TRptPanel.DrawMoveRect(x,y,w,h:integer);
begin
if not FDrawMoveRectFirst then
ReportEditor.RectTimer.OnTimer:=nil;
FCurrentRect:=Rect(x,y,x+w,y+h);
CanvasDrawFlowRect(ParentPanel.Canvas);
if FDrawMoveRectFirst then
ReportEditor.RectTimer.OnTimer:=TimerDrawMoveRect;
FDrawMoveRectFirst:=not FDrawMoveRectFirst;
end;

解释一下:
上面这些代码的功能是当用户拖着报表对象移动时,绘制一个流动的虚框。
流动的原理就是通过时钟中断,反复用不同的参数重新绘虚框。
在报表编辑器ReportEditor中有一个时钟控件(中断间隔约50,设到20则流动较快)。其事
件是在 DrawMoveRect 中设置和取消。
CanvasDrawFlowRect的功能是在Canvas上绘制一个虚框,不修改参数在调一次则隐藏此框,
修改FFlowPointIndexBase后CanvasDrawFlowRect绘制的虚框就流动了一点。顺便提一下,
Dec(FFlowPointIndexBase); 使虚框顺时针方向流动,Inc则反之。
DrawMoveRect必须成对调用:鼠标按下时调用一次,移动之前调用一次,移动之后调用一
次,放开时调用一次,临近的量次必须使用相同的参数。



 
多人接受答案了。
 
顶部