Page 1 of 3

Масштабирование под разные экраны

Posted: Sat Jun 10, 2017 10:58 pm
by Фант
Привет! Вот у меня спрайт. Он у меня масштабируется от высоты экрана девайса в ландшафте. Тоесть квадрат .maxy,.maxy. я картинку из этого спрайта сохраняю в файл в расширении .jpg и возвращаю эту картинку обратно в спрайт. Надо ли использовать scale и с каким значением?
Так же хотелось бы понять как правильно масштабировать изображение, если делать скрин экрана командой GRAPHICS SAVE X,Y, W,H TO N$, а затем это изображение отображать в графическом окне или спрайте. Мой планшет ipad 4 изображение отображает в масштабе 1:1 а вот девайсы iphone 6 и 7 изображение растягиваюt в два раза.

Re: Масштабирование под разные экраны

Posted: Sun Jun 11, 2017 4:43 am
by Mr. Kibernetik
Файл изображения обладает тремя взаимосвязанными характеристиками: размером в точках (pt), размером в пикселах (px) и масштабом (scale).

px = pt * scale

В smart BASIC

scale = dpi / 72

То есть изображение с dpi 72 будет иметь scale=1, а с dpi 144 будет иметь scale 2.

При сохранении/загрузке изображения smart BASIC считывает из файла px и dpi изображения, и таким образом определяет его scale и pt. Smart BASIC использует точки (pt) для размеров при сохранении/загрузке изображений.

Разные устройства имеют разный dpi экрана, поэтому и разный scale.

ПРИМЕР 1:
Изображение, у которого размер в точках равен 100 pt, на устройстве с dpi=72 при сохранении будет иметь размер 100 px и dpi=72, а на устройстве с ретина дисплеем у которого dpi=144 будет иметь размер 200 px и dpi=144.

ПРИМЕР 2:
При загрузке изображения размером 200 px и dpi=144 на устройство с экраном с dpi=72 smart BASIC определяет его scale:

scale = 144 / 72
scale = 2

и рассчитывает его размер в точках

pt = 200 / 2
pt = 100

Таким образом, изображение, сохраненное на устройстве с одним dpi экрана и потом загруженное на устройстве с другим dpi экрана, будет иметь одинаковый размер в точках на экране pt, потому что smart BASIC учитывает и px изображения, и dpi изображения, и dpi экрана как при сохранении, так и при загрузке изображения.

Re: Масштабирование под разные экраны

Posted: Sun Jun 11, 2017 2:53 pm
by Фант
Спасибо. Но меня сейчас интересует конкретный случай.
Я использую в программах изображения с разрешением 144. Это очень хорошо подходит для экранов моих девайсов с ретиной и без нее: ipad 4 и ipad mini 1. Для данных устройств изображения масштабировать не надо и в принципе вопрос у меня был не про этот случай.
В настоящий момент мне надо использовать в программе изображение, которое сохраняется из спрайта и после сохранения опять используется в этом же спрайте. Тоесть у меня есть программа, которая масштабируется для всех девайсов путем пересчета коэффициента. Этот коэффициент я расчитываю от известных размеров стандартного ipad и применяю у себя в программе для всех девайсов.
При сохранении изображения из спрайта на двух своих ipad я вижу следующее: ipad 4 сохраняет изображение с dpi 144, а ipad mini с dpi 72. Здесь вроде как все понятно: есть экран с ретина и есть обычный экран и когда я возвращаю эти сохраненные изображения обратно в спрайт-все встает на свои места без масштабирования. Свистопляска начинается в симуляторе xcod. В настоящий момент в симуляторе нет девайсов с экранами с dpi 72. Здесь минимальный ipad 4 и iphone 5. Вот если я пытаюсь в симуляторе ipad4 возвратить сохраненное изображение в спрайт без масштабирования, то это изображение возвращается увеличенным в два раза, а изображения для iphone 6+ Получается увеличенным в три раза! Тоесть на выходе получается не соответствие в масштабе для ipad 4 в реале и в симуляторе.
В симуляторе я обхожу данную проблему следующим образом: если изображение вернуть в спрайт с пересчетом масштаба-все получается идеально: draw image "..." at x,y scale 1/screen_scale(). Вот эта команда в симуляторе рисует изображение так как надо и на ipad4 и на iphone 6+, а в реале эта команда для ipad 4 уменьшает изображение (в точках) в два раза.
Так посоветуйте: что надо мне сделать в реале, чтобы вернуть изображение в спрайт в соотношении с размером этого спрайта в точках??? И чтобы это работало одинаково для всех устройств.
И еще. Команда SCREEN_SCALE () возвращает масштаб экрана. Не-Retina экраны имеют масштаб равный 1. Экраны Retina имеют масштаб равный 2. Это написано в инструкции. А какой масштаб имеют экраны девайсов iphone 6-7? Видимо у них коэффициент 3?

Re: Масштабирование под разные экраны

Posted: Sun Jun 11, 2017 3:01 pm
by Mr. Kibernetik
Фант wrote:
Sun Jun 11, 2017 2:53 pm
А какой масштаб имеют экраны девайсов iphone 6-7? Видимо у них коэффициент 3?
Запросто. Выполните на этих девайсах функцию SCREEN_SCALE() и увидите какой там коэффициент.

Как быть в каждом конкретном случае - это решать самому программисту.
Я могу только пояснить как считает smart BASIC и на что он обращает внимание при работе с изображениями.

Re: Масштабирование под разные экраны

Posted: Sun Jun 11, 2017 3:16 pm
by Фант
Mr. Kibernetik wrote:
Sun Jun 11, 2017 3:01 pm
Фант wrote:
Sun Jun 11, 2017 2:53 pm
А какой масштаб имеют экраны девайсов iphone 6-7? Видимо у них коэффициент 3?
Запросто. Выполните на этих девайсах функцию SCREEN_SCALE() и увидите какой там коэффициент.
В том то и дело-нет у меня этих девайсов. Если бы они были-этих вопросов бы у меня не было

Re: Масштабирование под разные экраны

Posted: Sun Jun 11, 2017 3:56 pm
by Фант
Прошу пользователей оказать помощь! Нужна проверка характеристик экрана разных устройств. (Особенно интересуют iPhone 5,5s,6,6+ и iPad pro,ipad air,ipad mini 2-4
Запустите программку и сделайте скрин экрана.
Так же прошу добавить скрин изображения 1".jpg", который получится после запуска программы.
GRAPHICS
REFRESH OFF
SET TOOLBAR OFF
SET ORIENTATION LANDSCAPE
OPTION TEXT POS CENTRAL
OPTION SPRITE POS CENTRAL
OPTION IMAGE POS CENTRAL
maxx=SCREEN_WIDTH()
maxy=SCREEN_HEIGHT()
SPRITE 1 BEGIN maxx,maxy
GRAPHICS CLEAR 0,0,0
DRAW CIRCLE maxx/2,maxy/2 SIZE maxy/2
DRAW LINE 0,maxy/2 TO maxx,maxy/2
DRAW LINE maxx/2,0 TO maxx/2,maxy
DRAW COLOR 1,1,0
DRAW FONT SIZE 50
DRAW TEXT "dpi="&SCREEN_SCALE ()*72 AT maxx/2,maxy/2
SPRITE END
SPRITE 1 SAVE "1.jpg"
SPRITE 1 BEGIN
GRAPHICS CLEAR
DRAW IMAGE "1.jpg" AT maxx/2,maxy/2
SPRITE END
SPRITE 1 SHOW
PAUSE 5

Re: Масштабирование под разные экраны

Posted: Sun Jun 11, 2017 5:38 pm
by DrChip
GRAPHICS
REFRESH OFF
SET TOOLBAR OFF
SET ORIENTATION LANDSCAPE
OPTION TEXT POS CENTRAL
OPTION SPRITE POS CENTRAL
OPTION IMAGE POS CENTRAL
maxx=SCREEN_WIDTH()
maxy=SCREEN_HEIGHT()
SPRITE 1 BEGIN maxx,maxy
GRAPHICS CLEAR 0,0,0
DRAW CIRCLE maxx/2,maxy/2 SIZE maxy/2
DRAW LINE 0,maxy/2 TO maxx,maxy/2
DRAW LINE maxx/2,0 TO maxx/2,maxy
DRAW COLOR 1,1,0
DRAW FONT SIZE 50
DRAW TEXT "dpi="&SCREEN_SCALE ()*72 AT maxx/2,maxy/2
SPRITE END
SPRITE 1 SAVE "1.jpg"
SPRITE 1 BEGIN
GRAPHICS CLEAR
DRAW IMAGE "1.jpg" AT maxx/2,maxy/2
SPRITE END
SPRITE 1 SHOW
PAUSE 5

Re: Масштабирование под разные экраны

Posted: Sun Jun 11, 2017 5:50 pm
by Фант
Thank you!

Re: Масштабирование под разные экраны

Posted: Sun Jun 11, 2017 5:56 pm
by Фант
В реале получается, что девайс сохраняет изображение в масштабе своего экрана и со своим dpi, поэтому при отображении изображения опять в том же спрайте никаких искажений не наблюдается. Получается xcod масштабирует не верно. :cry:

Re: Масштабирование под разные экраны

Posted: Mon Jun 12, 2017 5:12 pm
by Mr. Kibernetik
Фант wrote:
Sun Jun 11, 2017 5:56 pm
В реале получается, что девайс сохраняет изображение в масштабе своего экрана и со своим dpi, поэтому при отображении изображения опять в том же спрайте никаких искажений не наблюдается. Получается xcod масштабирует не верно. :cry:
Xcode имеется в виду симулятор iOS?