Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как соотносятся физический, логический  размер экрана, размер изображения и размеры контейнера (в моем случае Layout) в котором лежит изображение?


Humanoid

Вопрос

Кроссплатформенное приложение.
Картинка с камеры. На ней лежит ректангл. Вырезаю часть изображения по ректанглу. В винде все прекрасно. В андроид все смещается в зависимости от выбранного разрешения камеры.  
Вопрос: Не пойму как соотносятся физический, логический  размер экрана, Размер самого изображения и размеры контейнера (в моем случае Layout) в котором лежит изображение, между собой. Т.е. не могу правильно получить координаты вырезки на изображении. Как соотнести координаты ректангла с координатами изображения?
Вот последние изыскания в этом направлении.
Так хотя бы по высоте не прыгает...
Просветите плиз, как это все соотносится.

 

type
  TScreenS = record
    w: Single; // logic
    H: Single; // logic
    wp: Single; // phisics
    Hp: Single; // phisics
    D: Single; // scale display
  end;

var
  ScrSize:  TScreenS;
  imgDest : TBitMap;
  SouRec, DisRec: TRectF;
  .....

  ScrSize := GetScreenSize;
  Scale := imgCamera.Bitmap.Height / Layout1.Height;
  Ww := imgCamera.Bitmap.Width / Scale; // Ширина изображения приведенная к пропорции высоты
  tx := ((Layout1.Width - Ww) / 2); // Смещение изображения относительно контейнера по Х
  t:=0; // Смещение изображения относительно контейнера по Y


{$IFDEF ANDROID}
  Scale := Scale *  ScrSize.D; // Масштаб для андроида с учетом масштаба экрана
{$ENDIF}


  imgDest.Width := Rectangle1.Width;
  imgDest.Height := Rectangle1.Height;

// Исходная зона для копирования 
// Х = позиция ректангла по Х минус смещение относительно контейнера
// Y = позиция ректангла по Y минус смещение относительно контейнера
// конечная позиция то же плюс размеры ректангла
  SouRec := TRectF.Create((Rectangle1.Position.X - tx) * Scale,
    (Rectangle1.Position.Y - t) * Scale,
    (Rectangle1.Position.X + Rectangle1.Width - tx) * Scale,
    (Rectangle1.Position.Y + Rectangle1.Height - t) * Scale);
// Для Андроид добавляю разницу по высоте между физическим и логическим размерами экрана

{$IFDEF ANDROID}
  SouRec := TRectF.Create((Rectangle1.Position.X - tx) * Scale,
    (Rectangle1.Position.Y + (ScrSize.hp - ScrSize.h)) * Scale,
    (Rectangle1.Position.X + Rectangle1.Width - tx) * Scale,
    (Rectangle1.Position.Y + Rectangle1.Height + (ScrSize.hp - ScrSize.h)) * Scale);
{$ENDIF}

  DisRec := TRectF.Create(0, 0, Rectangle1.Width * Scale, Rectangle1.Height * Scale);

  imgDest.Bitmap.SetSize(Round(Rectangle1.Width * Scale),
    Round(Rectangle1.Height * Scale));
 
  imgDest.Bitmap.Canvas.BeginScene;
  imgDest.Bitmap.Canvas.DrawBitmap(imgCamera.Bitmap, SouRec, DisRec, 1);
  imgDest.Bitmap.Canvas.EndScene;

 

Ссылка на комментарий

Рекомендуемые сообщения

Ответов пока нет

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...