Масштабирование TRotLayer
Я работаю над графикой32. И я использую данный компонент из его примеров, 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 ответ
Псевдокод:
Рассчитаем исходные границы:
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);
Вы также можете взглянуть на Поворот растрового изображения на реальный угол для примера Graphics32 (без масштабирования).