0

我正在研究graphics32。我正在使用其示例中的给定组件 TRotLayer。基于示例(Examples/Layers/RotLayer_Ex),创建的RotLayer仅与ImgView一起缩放。如果未分配 ImgView.Bitmap,则 RotLayer 不会缩放。所以我修改了源代码,改变了它的行为。我更改了 TRotLayer.AdjustTransformation 程序。这就是我所做的。

procedure TRotLayer.AdjustTransformation;
var
ScaleX, ScaleY,
ShiftX, ShiftY: Single;
begin
Transformation.Clear;
Transformation.Translate(-BitmapCenter.X, -BitmapCenter.Y);
Transformation.Rotate(0, 0, Angle);
Transformation.Translate(Position.X, Position.Y);
Transformation.Scale(Scale.X, Scale.Y);
Transformation.Translate(Shift.X, Shift.Y);
//  if Scaled and Assigned(LayerCollection) then
//    with LayerCollection do
//    begin
//      GetViewportScale(ScaleX, ScaleY);
//      GetViewportShift(ShiftX, ShiftY);
//      Transformation.Scale(ScaleX, ScaleY);
//      Transformation.Translate(ShiftX, ShiftY);
//    end;
end;

我只是省略了限制并简单地执行了 .Scale 过程。我传递了 Scale.X 和 Scale.Y 的值,它按我的预期工作。图像已调整大小,但现在我的问题是定位。如果我缩放它的高度,图像会向上或向下移动,如果我缩放它的宽度,它会向右或向左移动。我只是想让它调整大小并保持在原来的位置。我注意到函数 .Translate 可能会解决我的问题,但我不知道在参数中传递什么。或者我不知道如何计算要传递的值。

任何人都可以帮助我解决这个问题。谢谢。

4

1 回答 1

1

伪代码:

  • 计算原始边界:

    Transformation.SrcRect := FloatRect(0, 0, Old.Width, Old.Height);

  • 将原点移动到该边界的中心:

    Transformation.Translate(-0.5 * Old.Width, -0.5 * Old.Height);

  • 围绕新原点旋转:

    Transformation.Rotate(0, 0, Degrees);

  • 规模

  • 计算新边界:

    New.Bounds := Transformation.GetTransformedBounds;

  • 将原点移回新边界的 (0, 0):

    Transformation.Translate(0.5 * New.Width, 0.5 * New.Height);

您还可以查看Rotate bitmap by real angle的 Graphics32 示例(无缩放)。

于 2013-05-20T10:54:24.910 回答