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

Масштабирование картинки по ширине или высоте

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



Автор: Шляхов Георгий

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Edit1: TEdit;
    Button1: TButton;
    Bevel1: TBevel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  Height, Width: integer;
  HH, WW: real;
begin
  Height := 329;
  Width := 329;
  Image1.Picture.LoadFromFile(edit1.Text);
  Image1.AutoSize := true;
  Image1.AutoSize := false;

  HH := Image1.Height / Height;
  WW := Image1.Width / Width;
  if (HH > WW) then
  begin
    Image1.Height := trunc(Image1.Height / HH);
    Image1.Width := trunc(Image1.Width / HH);
    Image1.Stretch := True;
    //ShowMessage('По высоте');
  end
  else
  begin
    Image1.Height := trunc(Image1.Height / WW);
    Image1.Width := trunc(Image1.Width / WW);
    Image1.Stretch := True;
    //ShowMessage('По ширине');
  end;
end;

end.

Программа - это простой графический пользовательский интерфейс (GUI), написанный на Delphi, который позволяет пользователю загрузить файл изображения и затем масштабировать его либо по высоте, либо по ширине.

Процесс работы программы следующий:

  1. Программа загружает файл изображения в компонент TImage с именем Image1.
  2. Когда пользователь нажимает кнопку, процедура Button1Click выполняется.
  3. Эта процедура рассчитывает текущую высоту и ширину изображения, а также их отношения к желаемым размерам (фиксированным в этом примере: 329x329 пикселей).
  4. Программа затем определяет, нужно ли масштабировать изображение по высоте или ширине. Это делается сравнением отношения высоты изображения к его ширине с пороговым значением.
  5. Если отношение больше 1, то это означает, что высота изображения больше ширины, поэтому программа масштабирует изображение вниз для включения в желаемые размеры, сохраняя соотношение сторон.
  6. В противном случае, если отношение меньше или равно 1, то это означает, что ширина изображения больше высоты, поэтому программа масштабирует изображение по ширине.
  7. После масштабирования изображения свойство Stretch компонента TImage устанавливается в True, что вызывает отображение изображения в его новых размерах.
  8. Затем программа отображает сообщение об ошибке, указывающее, было ли изображение масштабировано по высоте или ширине.

Следующие предложения для улучшения программы:

  1. Вместо фиксации желаемых размеровconsider позволить пользователю вводить эти значения в отдельном поле или диалоге.
  2. Рассмотреть добавление болееadvanced масштабирования опций, таких как сохранение соотношения сторон, растяжение или уменьшение изображения без сохранения его пропорций и т.д.
  3. Добавить обработку ошибок для случаев, когда файл не найден или изображение не может быть загружено.
  4. Было бы полезно предоставить просмотр масштабированного изображения перед применением изменений.

Вот пример рефакторинга кода для его более динамического и пользовательского интерфейса:

type
  TForm1 = class(TForm)
    Image1: TImage;
    Edit1: TEdit;
    Button1: TButton;
    Bevel1: TBevel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  DesiredWidth, DesiredHeight: integer;
  ImageRatio: real;
begin
  DesiredWidth := StrToInt(Edit1.Text);
  DesiredHeight := StrToInt(Edit2.Text); // add another edit field for height

  Image1.Picture.LoadFromFile(Edit3.Text); // add an edit field for the file path
  Image1.AutoSize := True;

  ImageRatio := Image1.Height / Image1.Width;
  if (ImageRatio > DesiredWidth / DesiredHeight) then
  begin
    Image1.Height := trunc(Image1.Height * DesiredWidth / DesiredHeight);
    Image1.Width := trunc(Image1.Width * DesiredWidth / DesiredHeight);
    Image1.Stretch := True;
    //ShowMessage('Scaled by height');
  end
  else
  begin
    Image1.Height := trunc(Image1.Height * DesiredHeight / DesiredWidth);
    Image1.Width := trunc(Image1.Width * DesiredHeight / DesiredWidth);
    Image1.Stretch := True;
    //ShowMessage('Scaled by width');
  end;

  // add a preview of the scaled image before applying the changes
end;

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

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


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

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




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


:: Главная :: Графика ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-21 09:30:33/0.0058469772338867/1