图像上加选框的问题,做过的请指点下,路过也有分 ( 积分: 100 )

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

helloqiner

Unregistered / Unconfirmed
GUEST, unregistred user!
现在要实现在一幅图像上加一个固定大小的选框,这个选框要求能够实时拖动,在拖动选框的时候,右侧预览Image上能显示出选区中图像的内容。
就这个功能不太会做,大家说说思路,有源码更好,可以另开贴加分。
 
现在要实现在一幅图像上加一个固定大小的选框,这个选框要求能够实时拖动,在拖动选框的时候,右侧预览Image上能显示出选区中图像的内容。
就这个功能不太会做,大家说说思路,有源码更好,可以另开贴加分。
 
在图像是用异或画一个边框,用ptinrect判断鼠标位置是否在框中,当鼠标按下滑动的时候重画边框,用Canvas.Copyrect取得,框内的图像
 
djptony兄讲得很有道理,不过我对图形图像处理没怎么接触过,劳驾能否写几行核心代码出来,谢谢。
 
有点感觉象放大镜那种了,哈哈!
 
用Canvas.Copyrect怎么弄
 
也在找它,


关注关注
 
路过。接分! 穷啊
 
路过。接分!
 
使用DrawFocusRect函数绘制虚线框,在WM_LBUTTONDOWN/WM_LBUTTONUP/WM_MOUSEMOVE消息中画.然后利用StretchBlt函数来拷贝区域,下面有一段使用DrawFocusRect的代码:

procedure TPowerCustomTreeNode.DoDrawFocusRect;
var
dc: HDC;
begin
//绘制焦点。这里不能使用Self.Canvas.Handle,不知道为什么
//DrawFocusRect函数是一个异或函数,再次调用清除绘制的虚线框
dc := GetDC(Handle);
DrawFocusRect(dc, ClientRect);
ReleaseDC(Handle, dc);
end;
 
djptony的做法可以。
不过我还有一个较为简单的做法,你在Image上放一个矩形的shape。
在Shape的Mouse里事件里处理Shape移动。

至于预览,知道了Shape的坐标,把相应的Image上的图像CopyRect到
预览的Image上就可以了。
 
嗯,我现在是在一张底图上放了另一个小的 Image 控件,在上面这个 Image 控件里画出一个类似于选框的东东,然后允许在运行期拖动 Image。
但有个问题,假如底图很大,是有滚动条的,那么用 Image 控件要怎么样才能获取它在底图上具体的坐标呢,怎样才能将选中的区域截取下来?
 
告诉你一个简单的方法
在image上放一个shape控件,将shape控件的shape属性设置为stRectangle,Brush的Style设置为bsClear
就是矩形选择框了。
然后在Image2中预览你选择的部分
R1 := Shape1.BoundsRect ;
R.TopLeft.X := 0;
R.TopLeft.Y := 0 ;
R.BottomRight.X := R1.BottomRight.X -Shape1.Left ;
R.BottomRight.Y := R1.BottomRight.Y -Shape1.Top ;
Image2.Canvas.CopyRect(R,Image1.Canvas,R1);
就是这样。很好用。:)
 
忘记了Shape控件的移动下面给出Shape中两个事件的代码还有两个全局变量
//以下代码实现Shape的拖动
OldX,OldY:Integer;
procedure TFrmVideo.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
OldX := X;
OldY := Y;
end;
end;

procedure TFrmVideo.Shape1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
NewX,NewY:Integer;
begin
if Shift=[ssLeft] then
begin
NewX := Shape1.Left + X - OldX;
NewY := Shape1.Top + Y - OldY;
Shape1.Left := NewX;
Shape1.Top := NewY;
end;
end;
 
谢谢各位啦
 
后退
顶部