Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.06.2019, 21:18
DDim1000 DDim1000 вне форума
Прохожий
 
Регистрация: 28.12.2012
Сообщения: 18
Репутация: 10
Счастье Кнопки масштабирования изображения

Здравствуйте!
Подскажите пожалуйста, как сделать кнопки увеличения\уменьшения масштаба изображения, закруженного в image?
Ответить с цитированием
  #2  
Старый 25.06.2019, 23:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, сами-то кнопки сделать легко.
А вот реакцию на их нажатие - сложно.
В зависимости от потребностей, тебе придется использовать TImage с streach=true и самому пересчитывать размеры TImage, либо использовать TPaintBox и, соответсвенно, писать соответствующую отрисовку с нужным увеличением/уменьшением.
Ответить с цитированием
  #3  
Старый 26.06.2019, 14:08
DDim1000 DDim1000 вне форума
Прохожий
 
Регистрация: 28.12.2012
Сообщения: 18
Репутация: 10
Счастье

Цитата:
Сообщение от lmikle
...
В зависимости от потребностей, тебе придется использовать TImage с streach=true и самому пересчитывать размеры TImage,....
А как пересчитываются размеры, чтоб сохранить пропорции? Формула какая-то есть? Или по соотношению сторон вычислять?

Допустим, картинка h=1825, w=1374. И если, например, я поставлю h=1798, то, как найти w? или наоборот, если w изменятся, то как найти h?
Ответить с цитированием
  #4  
Старый 26.06.2019, 19:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, просто заведи себе коэф. "увеличения".
Пусть у тебя оригинальная картинка (ее размер) лежит в ImgSize : TPoint (просто удобно использовать данный тип). Тогда:
Код:
type
  TForm1 = class(TForm)
  ...
    Image1 : TImage;
  ...
  private
    ImgScale : Double; // default 1.0 - set in OnCreate
    ImgSize : TPoing; // Width and Height of original image, set when load image
  end;
...
procedure TForm1.ResizeImage;
begin
  Image1.Width := Round(ImgSize.x*ImgScale);
  Image1.Height := Round(ImgSize.y*ImgScale);
end;

procedure TForm1.btZoomInClick(Sender : TObject);
begin
  ImgScale := ImgScale * 2;
  ResizeImage;
end;

procedure TForm1.btZoomOutClick(Sender : TObject);
begin
  ImgScale := ImgScale / 2;
  ResizeImage;
end;
Ответить с цитированием
  #5  
Старый 26.06.2019, 20:14
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 173
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Ещё вариант - использовать сторонние компоненты. Например, в EhLib-е есть соответствующий компонент с возможностью масштабирования. Но наилучшим из всех мне известных оказался ImageEn, вот он масштабирует очень качественно, и можно метод указать, с целью точной настройки между скоростью и качеством. При этом физические размеры самой картинки не меняются, меняется только масштаб отображения.

Последний раз редактировалось Guaho, 26.06.2019 в 20:18.
Ответить с цитированием
  #6  
Старый 06.07.2019, 22:09
DDim1000 DDim1000 вне форума
Прохожий
 
Регистрация: 28.12.2012
Сообщения: 18
Репутация: 10
Счастье

Почему при нажатии на кнопки картинка исчезает?:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ieview, imageenview, imageen,
  Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ResizeImage;
  private
    { Private declarations }
      ImgScale : Double; // default 1.0 - set in OnCreate
      ImgSize : TPoint; // Width and Height of original image, set when load image
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ImgScale := ImgScale * 2;
  ResizeImage;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ImgScale := ImgScale / 2;
  ResizeImage;
end;

procedure TForm1.ResizeImage;
begin
  Image1.Width := Round(ImgSize.x*ImgScale);
  Image1.Height := Round(ImgSize.y*ImgScale);
end;

end.
Ответить с цитированием
  #7  
Старый 06.07.2019, 22:28
DDim1000 DDim1000 вне форума
Прохожий
 
Регистрация: 28.12.2012
Сообщения: 18
Репутация: 10
Счастье

Цитата:
Сообщение от Guaho
Ещё вариант - использовать сторонние компоненты. Например, в EhLib-е есть соответствующий компонент с возможностью масштабирования. Но наилучшим из всех мне известных оказался ImageEn, вот он масштабирует очень качественно, и можно метод указать, с целью точной настройки между скоростью и качеством. При этом физические размеры самой картинки не меняются, меняется только масштаб отображения.
Установил ImageEn, создал проект, на форме разместил ImageEn1, через WalPaper(TBitmap) загрузил картинку, скомпилировал и запустил программу, но картинка не отображается.
Почему так?
Ответить с цитированием
  #8  
Старый 13.07.2019, 14:28
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 173
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Некоторые важные функции этого компонента почему-то не работают должным образом (по крайней мере, у меня это так). В частности, загрузить изображение получилось только из буфера обмена (загрузка из файла и из потока - не работает):
Код:
image1.Proc.PasteFromClipboard;
Я работаю с TImageEnDBView, поэтому мне так это критично, а вот для загрузки изображений из внешних источников использую копипаст через буфер обмена, да ещё с привлечением стороннего компонента (TImageEh), т.к. делаю изменение размеров при загрузке. Танцы с бубном, но по-другому не выходило. Сторонний компонент используется для определения, являются ли данные в буфере обмена изображением (ImageEn, если данные не графические, создаёт пустое белое изображение).

Последний раз редактировалось Guaho, 13.07.2019 в 14:36.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter