Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Масштабирование изображений в программе на Delphi: решение проблемы обрезки и панорамирования

Delphi , Графика и Игры , Canvas

Масштабирование изображений в программе на Delphi

В статье мы рассмотрим проблему масштабирования изображений в программе, написанной на Delphi, которая напоминает функционал программы Paint. Основное внимание будет уделено решению проблемы обрезки и панорамирования при изменении масштаба.

Проблема

При разработке функционала масштабирования изображения в Delphi, пользователь столкнулся с проблемой, когда при увеличении масштаба, изображение масштабировалось только в верхнем левом углу, что не позволяло просматривать всю область изображения после изменения масштаба.

Пример кода

В коде, предоставленном пользователем, используется процедура SetCanvasZoomFactor, которая изменяет масштаб в зависимости от заданного коэффициента. Однако, из-за особенностей работы с графикой в Delphi, изображение масштабируется не равномерно, что и приводит к описанной проблеме.

procedure SetCanvasZoomFactor(Canvas: TCanvas; AZoomFactor: Integer);
begin
  if AZoomFactor = 100 then
    SetMapMode(Canvas.Handle, MM_TEXT)
  else
  begin
    SetMapMode(Canvas.Handle, MM_ISOTROPIC);
    SetWindowExtEx(Canvas.Handle, AZoomFactor, AZoomFactor, nil);
    SetViewportExtEx(Canvas.Handle, 100, 100, nil);
  end;
end;

Решение проблемы

Для решения проблемы масштабирования всего изображения и возможности панорамирования, можно использовать функцию SetWorldTransform. Пример реализации процедуры SetCanvasZoomAndRotation выглядит следующим образом:

procedure SetCanvasZoomAndRotation(ACanvas: TCanvas; Zoom: Double;
  Angle: Double; CenterpointX, CenterpointY: Double);
var
  form: tagXFORM;
  rAngle: Double;
begin
  rAngle := DegToRad(Angle);
  SetGraphicsMode(ACanvas.Handle, GM_ADVANCED);
  SetMapMode(ACanvas.Handle, MM_ANISOTROPIC);
  form.eM11 := Zoom * Cos(rAngle);
  form.eM12 := Zoom * Sin(rAngle);
  form.eM21 := Zoom * (-Sin(rAngle));
  form.eM22 := Zoom * Cos(rAngle);
  form.eDx := CenterpointX;
  form.eDy := CenterpointY;
  SetWorldTransform(ACanvas.Handle, form);
end;

Процедура ResetCanvas может быть использована для сброса трансформации:

procedure ResetCanvas(ACanvas: TCanvas);
begin
  SetCanvasZoomAndRotation(ACanvas, 1, 0, 0, 0);
end;

Вы можете определить параметры масштабирования, смещения и вращения для нужного вам Canvas перед рисованием.

Пример использования

Для демонстрации использования процедуры, предоставьте следующий код:

procedure TForm2.PaintBox1Paint(Sender: TObject);
var
  C: TCanvas;
begin
  C := TPaintBox(Sender).Canvas;
  SetCanvasZoomAndRotation(C, 1 + i / 5, i * 36, TPaintBox(Sender).Width div 2, TPaintBox(Sender).Height div 2);
  C.Draw(0, 0, Image1.Picture.Graphic);
  // Другие операции с изображением
end;

Использование с ползунками для управления масштабом и смещением изображения:

procedure TForm2.PaintBox1Paint(Sender: TObject);
var
  C: TCanvas;
begin
  TrackBarHorz.Max := Round(Image1.Picture.Graphic.Width * SpinEditZoomInPercent.Value / 100 - TPaintBox(Sender).Width);
  TrackBarVert.Max := Round(Image1.Picture.Graphic.Height * SpinEditZoomInPercent.Value / 100 - TPaintBox(Sender).Height);
  C := TPaintBox(Sender).Canvas;
  SetCanvasZoomAndRotation(C, SpinEditZoomInPercent.Value / 100, 0, -TrackBarHorz.Position, -TrackBarVert.Position);
  C.Draw(0,0,Image1.Picture.Graphic);
end;

Использование с TImage

Для использования с компонентом TImage, необходимо сначала очистить содержимое изображения, например, Image1.Picture.Bitmap := nil, перед повторным рисованием, если новое изображение не будет покрывать всю область TImage.

Заключение

Применение процедуры SetWorldTransform позволяет решить проблему обрезки и панорамирования при изменении масштаба изображения в программе на Delphi. Это решение дает разработчику гибкость в управлении масштабированием и панорамированием, что важно для создания программ, подобных Paint.

Создано по материалам из источника по ссылке.

В статье рассматривается проблема масштабирования изображений в программе, созданной на языке программирования Delphi, и предлагается решение для равномерного масштабирования и панорамирования изображений.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Canvas ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 22:04:54/0.0035099983215332/0