TImage

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

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

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

Сообщение vitaly_l »

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

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

Хотя..., :idea: где-то внутри эта инфа прописывается и рассчитывается. :arrow: Соответственно, если сделать надстройку над классом TImage и потом можно будет выуживать+рассчитывать нужные параметры.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Ustas

TImage.wight/Height, как ни банально.
Ustas
постоялец
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Сообщение Ustas »

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


Может не корректно задал вопрос.
Если загружать в TImage без растягивания (пропорционально), то может возникнуть ситуация, когда, или по ширине или по высоте загруженная картинка будет меньше чем TImage. Вот эти значения меня и интересуют.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

размер именно картинки это:

Код: Выделить всё

  Image1.Picture.Width;
  Image1.Picture.Height;

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

Сообщение Ustas »

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

размер именно картинки это:

Код: Выделить всё

  Image1.Picture.Width;
  Image1.Picture.Height;

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

Разница есть, но не тут.
Во вложении, TImage, где TImage.Picture.Width и TImage.Picture.Height равно (соответственно) 150 и 210, реальная картинка получается (примерно) 142 и 210 (реальная картинка еще большие), видно по бокам полосы. Вот размеры получившейся картинки меня и интересуют.
Согласен, что Timage -это всего лишь компонент, но блин, внутри этого компонента были произведены расчеты по масштабированию этой картинки, и он ее отрисовал у себя на канве с Width = 142 и Height = 210. Так вопрос в том: можно их (смасштабированные размеры) получить?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

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

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

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

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

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

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

.
Ustas
постоялец
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Сообщение Ustas »

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

Сообщение Лекс Айрин »

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

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

(Picture.Width * Height )/ Picture.Height

2) x=Picture.Height

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

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

Сообщение Ustas »

Вот как я считаю:

Код: Выделить всё

  // если задан размер избражение изменяем фон окна
  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; // на фроме
Ответить