缩放TRotLayer

时间:2013-05-20 08:21:49

标签: delphi resize scale graphics32

我正在研究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可能解决我的问题,但我不知道在参数中传递什么。或者我不知道如何计算要传递的值。

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

1 个答案:

答案 0 :(得分: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示例(不进行缩放)。