TImage

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: TImage

Сообщение vitaly_l » 15.11.2016 12:44:02

Ustas писал(а):Есть возможность узнать размер пропорционально вписанной в TImage картинки, не репльный размер, а получившийся?

Вряд ли, т.к. изображение автоматом скэйлится (меняет размер), в зависимости от размера окна программы / TImage.

Хотя..., :idea: где-то внутри эта инфа прописывается и рассчитывается. :arrow: Соответственно, если сделать надстройку над классом TImage и потом можно будет выуживать+рассчитывать нужные параметры.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TImage

Сообщение Лекс Айрин » 15.11.2016 14:23:29

Ustas

TImage.wight/Height, как ни банально.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: TImage

Сообщение Ustas » 15.11.2016 19:18:38

Лекс Айрин писал(а):Ustas
TImage.wight/Height, как ни банально.


Может не корректно задал вопрос.
Если загружать в TImage без растягивания (пропорционально), то может возникнуть ситуация, когда, или по ширине или по высоте загруженная картинка будет меньше чем TImage. Вот эти значения меня и интересуют.
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: TImage

Сообщение Лекс Айрин » 16.11.2016 11:35:37

Ustas, вообще-то, стоит учитывать, что TImage это НЕ картинка, а компонент ее отображающий.

размер именно картинки это:
Код: Выделить всё
  Image1.Picture.Width;
  Image1.Picture.Height;

и никакой разницы, как именно она была загружена.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: TImage

Сообщение Ustas » 16.11.2016 19:57:28

Лекс Айрин писал(а):Ustas, вообще-то, стоит учитывать, что TImage это НЕ картинка, а компонент ее отображающий.

размер именно картинки это:
Код: Выделить всё
  Image1.Picture.Width;
  Image1.Picture.Height;

и никакой разницы, как именно она была загружена.

Разница есть, но не тут.
Во вложении, TImage, где TImage.Picture.Width и TImage.Picture.Height равно (соответственно) 150 и 210, реальная картинка получается (примерно) 142 и 210 (реальная картинка еще большие), видно по бокам полосы. Вот размеры получившейся картинки меня и интересуют.
Согласен, что Timage -это всего лишь компонент, но блин, внутри этого компонента были произведены расчеты по масштабированию этой картинки, и он ее отрисовал у себя на канве с Width = 142 и Height = 210. Так вопрос в том: можно их (смасштабированные размеры) получить?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: TImage

Сообщение vitaly_l » 16.11.2016 20:21:12

Ustas писал(а): Так вопрос в том: можно их (смасштабированные размеры) получить?

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

Что из них длиннее: высота или ширина?

Предположим длиннее ширина, тогда делите ширину исходной битмапки на TImage.Width. В итоге получаете коэффициент.
Соответственно, теперь чтобы узнать высоту, нужно: разделить высоту исходной битмапки на коэффициент.

Ну а если высота длиннее, то делаете всё тоже самое только поменяв ингредиенты на противоположные.

Добавлено спустя 88 минут 88 секунд:
Можно кстати делить высоту на ширину и тоже получить некий коэффициент, при умножении известной стороны, на который - будет возвращаться нужное значение. И одна из сторон Вам всегда известна, т.к. она совпадает с наибольшей длинной стороны TImage.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TImage

Сообщение Ustas » 16.11.2016 21:05:03

Задав вопрос, я, чуть позже, догадался что халява не пройдет, но все же надеялся...
Поэтому, попытался решить вопрос самостоятельно. Приведенная в примере картинка, построена по моим расчетам.
Спасибо всем за помощь!
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: TImage

Сообщение Лекс Айрин » 16.11.2016 21:08:38

Ustas писал(а):Так вопрос в том: можно их (смасштабированные размеры) получить?

так же как считаются пропорции)))
сначала надо узнать какая сторона занимает весь компонент.
а дальше как и любая пропорция...
2 варианта
1) x= Picture.Width

(Picture.Width * Height )/ Picture.Height

2) x=Picture.Height

( Picture.Height * Width)/ (Picture.Width * Height

Лично у меня затруднение вызывает лишь нахождение стороны полностью занимающей канву.
Подозреваю, что проще посчитать оба варианта и выбрать тот из них, который полностью входит в габариты.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: TImage

Сообщение Ustas » 16.11.2016 22:08:03

Вот как я считаю:
Код: Выделить всё
  // если задан размер избражение изменяем фон окна
  if tmp_Win_Value then
    begin
      // закрашиваем изображение
      tmp_Image.Picture.Bitmap.Canvas.Pen.Style := psSolid;
      tmp_Image.Picture.Bitmap.Canvas.Pen.Color := clSkyBlue;
      tmp_Image.Picture.Bitmap.Canvas.Brush.Color := clSkyBlue;
      tmp_Image.Picture.Bitmap.Canvas.Brush.Style := bsSolid;
      tmp_Image.Picture.Bitmap.Canvas.Rectangle
        (
         0, 0, tmp_Image.Width, tmp_Image.Height
        );
      // пропорционально вписываем изображение
      kw := tmp_bmp.Width / tmp_Image.Width;
      kh := tmp_bmp.Height / tmp_Image.Height;
      if kw > kh then
        begin // если ширина вписывается
          W := tmp_Image.Width;
          H := (tmp_Image.Height - Round(tmp_bmp.Height / kw)) div 2 ;
          tmp_Image.Picture.Bitmap.Canvas.CopyRect
            (
             Rect(0, H, W, tmp_Image.Height - H),
             tmp_bmp.Canvas,
             Rect(0, 0, tmp_bmp.Width, tmp_bmp.Height)
            );
        end
      else
        begin // если высота вписывается
          W := (tmp_Image.Width - Round(tmp_bmp.Width / kh)) div 2;
          H := tmp_Image.Height;
          tmp_Image.Picture.Bitmap.Canvas.CopyRect
            (
             Rect(W, 0, tmp_Image.Width - W, H),
             tmp_bmp.Canvas,
             Rect(0, 0, tmp_bmp.Width, tmp_bmp.Height)
            );
        end
    end;

где
Код: Выделить всё
tmp_bmp: TBitmap; // передается изображение
tmp_Image: : TImage; // на фроме
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34

Рейтинг@Mail.ru
cron