用变焦中心(Delphi,FMX)rot旋转图像

问题描述 投票:0回答:1

开始一个新的空白FMX多边形项目

add tpanel与客户端对齐

添加了青毒,用任何图像填充其多重企业属性

    将图像的hittest属性设置为false(用于Zoom的面板输入)
  • 在图像下方的最小代码样本中,以表单的形式过程旋转(或者不查看在某个点应该如何工作的缩放)。滚动在面板1mousewheel过程中的鼠标上的车轮时,在鼠标位置进行缩放。
  • 因此,需要调整的只是评论以下的两行 //缩放时图像位置的校正
  • procedure TForm1.FormCreate(Sender: TObject); begin // Image1.RotationAngle := 0; Image1.RotationAngle := 30; end; procedure TForm1.Panel1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); var zoom_center: TPointF; new_scale,old_scale: single; P1,P2: TPointF; begin // Scaling (mousewheel) if shift = [] then begin zoom_center := screen.MousePos - ClienttoScreen(Image1.LocalToAbsolute(PointF(0,0))); old_scale := Image1.Scale.X; if WheelDelta>=0 then new_scale := old_scale * (1 + (WheelDelta / 120)/5) else new_scale := old_scale / (1 - (WheelDelta / 120)/5); Image1.Scale.X := new_scale; Image1.Scale.Y := new_scale; // correction for image position when scaling Image1.Position.X := Image1.Position.X + zoom_center.x * (1-new_scale/old_scale); Image1.Position.Y := Image1.Position.Y + zoom_center.y * (1-new_scale/old_scale); end; end;
我假设您想放大光标,以使光标的图像像素不会移动。您的代码即使在Angle为0时也不会这样做。您的代码有几个问题。首先,您如何计算Zoom_center,其次是如何纠正图像位置。这是您的代码评论的校正代码。当旋转角度为0或30时,它似乎起作用。

procedure TForm1.Panel1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); var zoom_center: TPointF; new_scale,old_scale: single; P1,P2: TPointF; begin // Scaling (mousewheel) if shift = [] then begin //zoom_center := screen.MousePos - ClienttoScreen(Image1.LocalToAbsolute(PointF(0,0))); zoom_center := ScreenToClient(Screen.MousePos) - Panel1.Position.Point; old_scale := Image1.Scale.X; if WheelDelta>=0 then new_scale := old_scale * (1 + (WheelDelta / 120)/5) else new_scale := old_scale / (1 - (WheelDelta / 120)/5); Image1.Scale.X := new_scale; Image1.Scale.Y := new_scale; // correction for image position when scaling //Image1.Position.X := Image1.Position.X + zoom_center.x * (1-new_scale/old_scale); //Image1.Position.Y := Image1.Position.Y + zoom_center.y * (1-new_scale/old_scale); Image1.Position.Point := zoom_center - (new_scale * (zoom_center - Image1.Position.Point) / old_scale); end; end;

我使用了此代码,它也对我有用。我唯一要改进的是更改面板1.CLIPRECT = true,以阻止在表单的其余部分上停止缩放图像绘图。但是很多人感谢 @xylemflow
    
delphi rotation zooming scale firemonkey
1个回答
4
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.