Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Масштабирование TImage на форме, Stretch/Prportional и другие свойства 
:(
    Опции темы
malor
  Дата 17.8.2011, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



1) Как сделать так, чтобы при растягивании мышью формы не было вот этих пустот?

user posted image

user posted image

У TImage выставлено свойства Stretch/Proportional равными True.

2) Как сделать так, чтобы форма (ну или, что тоже самое, TImage) при запуске программы приводились к размерам изображения? На этапе дизайна выставить AutoSize ?

Цитата
Если AutoSize имеет значение True, элемент управления изображением будет изменять свои размеры, чтобы соответствовать размеру содержащегося в нем изображения Данные самого изображения содержатся в свойстве Picture. Если AutoSize — False, элемент управления изображением не будет изменять размеры при загрузке изображения; если изображение больше элемента управления изображением, появится только его часть. Значение по умолчанию составляет False.
       Если AutoSize установлено в True после загрузки изображения, это не окажет никакого эффекта; если вы хотите, чтобы элемент управления изображением изменил свой размер в соответствии с изображением следует установить AutoSize в True до загрузки изображения Чтобы изменить размеры изображения в соответствии с элементом управления изображением, используйте свойство Stretch.


Это сообщение отредактировал(а) malor - 17.8.2011, 10:40

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  ResizeProject.zip 108,04 Kb
PM MAIL   Вверх
rodnover
Дата 17.8.2011, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Код

Image1.Align := alClient

PM MAIL   Вверх
malor
  Дата 17.8.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



>>Image1.Align := alClient

Это у меня уже выставлено. 
Не действует?..

Delphi XE
PM MAIL   Вверх
rodnover
Дата 17.8.2011, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Почту скажи, тестовый проект вышлю
PM MAIL   Вверх
malor
  Дата 17.8.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



У тебя пустот нет из-за того, что свойство Proportional выставлено False.

Это сообщение отредактировал(а) malor - 17.8.2011, 10:40
PM MAIL   Вверх
malor
  Дата 17.8.2011, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Почему здесь одно количество пикселей - 
user posted image

а здесь другое -
user posted image

Как все выглядит:
user posted image

Сам TImage: 
user posted image

Код
const pathImage    = 'D:\Image.jpg';

procedure TForm2.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
var
  ScaleForm: Double;
begin
  ScaleForm := NewWidth / NewHeight;
  if ScaleForm > Scale then
  begin
    NewHeight := Trunc(NewWidth / Scale);
  end
  else
  begin
    NewWidth := Trunc(Scale * NewHeight);
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Scale := Image1.Width / Image1.Height;

  if (FileExists(pathImage)) then
    Image1.Picture.LoadFromFile(pathImage);
end;


Что не так?

Это сообщение отредактировал(а) malor - 17.8.2011, 22:38

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  ScaleProject.zip 107,30 Kb
PM MAIL   Вверх
Snowy
Дата 17.8.2011, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Цитата(malor @  17.8.2011,  20:46 Найти цитируемый пост)
Почему здесь одно количество пикселей 

- а здесь другое -
Потому что 640х480 - это размер изображения, а 327х344 - размер формы.

Что касается вопроса, то просто нужно быдерживать соотношение wi/hi=wf/hf - отношение ширины и высоты изображения = отношение ClientWidth/ClientHeight
Таким образом, нужно привести формулу к одной неизвестной. Высота и ширина Image1.Picture у тебя есть.
Чтобы подогнать размеры формы, нужно выбрать, что подгонять - ширину под высоту или высоту под ширину.
Выбрать можно фиксировано, а можно придумать алгоритм, что брать за основу. Фиксировано проще.
Ну а дальше выражаешь из формулы вычисляемую величину и устанавливаешь в зависимости от остальных.
PM MAIL   Вверх
malor
  Дата 18.8.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Цитата(Snowy @  17.8.2011,  23:19 Найти цитируемый пост)
Потому что 640х480 - это размер изображения, а 327х344 - размер формы.

Почему форма не подогналась под размеры содержащегося в TImage изображения?

Хомоненко А., "Delphi 7 в подлиннике", 2007, стр. 430:
"Свойство AutoSize типа Boolean управляет возможностью автоматического при­ведения размеров компонента image к размерам содержащегося в нем изображе­ния. Если свойство AutoSize установлено в значение True, то размеры элемента Image приводятся к размерам изображения, если в значение False (по умолча­нию), то нет."

Цитата(Snowy @  17.8.2011,  23:19 Найти цитируемый пост)
Что касается вопроса, то просто нужно выдерживать соотношение wi/hi = wf/hf - отношение ширины и высоты изображения = отношение ClientWidth/ClientHeight
В приведенном коде переменная Scale разве не выполняет подобной функции? 
PM MAIL   Вверх
Snowy
Дата 18.8.2011, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Цитата(malor @  18.8.2011,  10:34 Найти цитируемый пост)
Почему форма не подогналась под размеры содержащегося в TImage изображения?
Она подогналась под размер TImage, а не под размер изображения, находящегося в TImage.

Цитата(malor @  18.8.2011,  10:34 Найти цитируемый пост)
"Свойство AutoSize типа Boolean управляет возможностью автоматического при­ведения размеров компонента image к размерам содержащегося в нем изображе­ния."
Если ты сделаешь AutoSize у TImage, то она примет размеры строго по изображению.
А ты вроде как хотел менять размер.

Цитата(malor @  18.8.2011,  10:34 Найти цитируемый пост)
В приведенном коде переменная Scale разве не выполняет подобной функции? 
Выполняет. Только неправильно, т.к. тебе нужен размер картинки, а не размер TImage.
Код
procedure TForm2.FormCreate(Sender: TObject);
begin
  if (FileExists(pathImage)) then
    Image1.Picture.LoadFromFile(pathImage);
  Scale := Image1.Picture.Width / Image1.Picture.Height;
end;

PM MAIL   Вверх
malor
  Дата 18.8.2011, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



s>>Если ты сделаешь AutoSize у TImage, то она примет размеры строго по изображению.

Но у меня на последнем из скринов как раз и выставлено свойство AutoSize у TImage равным True. 


s>>А ты вроде как хотел менять размер.

Это уже следующий шаг.
PM MAIL   Вверх
Keeper89
Дата 18.8.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



Для старта подойдет вот это:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  if Assigned(img1.Picture) then
  begin
    ClientWidth := img1.Picture.Width;
    ClientHeight := img1.Picture.Height;
  end;
end



--------------------
PM MAIL WWW   Вверх
malor
  Дата 19.8.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



[1]
K>>Для старта подойдет вот это:

user posted image

Величины ClientWidth и ClientHeight не изменились от операции присвоения. Почему?

[2]
Если перебросить эти 5 строчек в функцию FormCanResize, то будет так:
user posted image

user posted image

Если выставить "AutoSize = True" у TForm и у TImage, то разве этого не достаточно, чтобы при FormCreate() форма подогналась под размер TImage, а TImage в свою очередь под размер загруженного в него изображения?

[3]
Если использовать вот такой вариант:
Код
const pathImage    = 'D:\Image.jpg';
var OnLoad: boolean = true;

procedure TForm2.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
var
  ScaleForm: Double;
begin

  if OnLoad then
  begin
    if Assigned(Image1.Picture) then
    begin
      NewWidth := Image1.Picture.Width;
      NewHeight := Image1.Picture.Height;
    end;
    OnLoad := false;
    Exit;
  end;

  ScaleForm := NewWidth / NewHeight;
  if ScaleForm > Scale then
  begin
    NewHeight := Trunc(NewWidth / Scale);
  end
  else
  begin
    NewWidth := Trunc(Scale * NewHeight);
  end;


end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  if (FileExists(pathImage)) then
    Image1.Picture.LoadFromFile(pathImage);

  Scale := Image1.Picture.Width / Image1.Picture.Height;
end;

Свойства TImage; 
user posted image

То при запуске программы вид:
user posted image

Если попробовать прижать мышью заголовок формы и оттащить окно, то сразу станет так:
user posted image

вот это как раз то, что и хотелось бы получить - именно подобный вид. Но каким образом ?

Это сообщение отредактировал(а) malor - 19.8.2011, 18:12
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.