- 0
Как соотносятся физический, логический размер экрана, размер изображения и размеры контейнера (в моем случае Layout) в котором лежит изображение?
-
Последние посетители 0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
Вопрос
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;
Ссылка на комментарий
0 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.