我正在研究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可能解决我的问题,但我不知道在参数中传递什么。或者我不知道如何计算要传递的值。
任何人都可以帮我解决这个问题。感谢。
答案 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示例(不进行缩放)。