Привет! Вот у меня спрайт. Он у меня масштабируется от высоты экрана девайса в ландшафте. Тоесть квадрат .maxy,.maxy. я картинку из этого спрайта сохраняю в файл в расширении .jpg и возвращаю эту картинку обратно в спрайт. Надо ли использовать scale и с каким значением?
Так же хотелось бы понять как правильно масштабировать изображение, если делать скрин экрана командой GRAPHICS SAVE X,Y, W,H TO N$, а затем это изображение отображать в графическом окне или спрайте. Мой планшет ipad 4 изображение отображает в масштабе 1:1 а вот девайсы iphone 6 и 7 изображение растягиваюt в два раза.
Масштабирование под разные экраны
- Mr. Kibernetik
- Site Admin
- Posts: 4786
- Joined: Mon Nov 19, 2012 10:16 pm
- My devices: iPhone, iPad, MacBook
- Location: Russia
- Flag:
Re: Масштабирование под разные экраны
Файл изображения обладает тремя взаимосвязанными характеристиками: размером в точках (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 экрана как при сохранении, так и при загрузке изображения.
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 экрана как при сохранении, так и при загрузке изображения.
- Фант
- Posts: 1363
- Joined: Sat Nov 30, 2013 10:01 am
- My devices: iPad 4 (iOS 9.3), iMac (MAC OS 11.03)
- Location: Россия,Санкт-Петербург
- Flag:
- Contact:
Re: Масштабирование под разные экраны
Спасибо. Но меня сейчас интересует конкретный случай.
Я использую в программах изображения с разрешением 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?
Я использую в программах изображения с разрешением 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?
- Mr. Kibernetik
- Site Admin
- Posts: 4786
- Joined: Mon Nov 19, 2012 10:16 pm
- My devices: iPhone, iPad, MacBook
- Location: Russia
- Flag:
Re: Масштабирование под разные экраны
Запросто. Выполните на этих девайсах функцию SCREEN_SCALE() и увидите какой там коэффициент.
Как быть в каждом конкретном случае - это решать самому программисту.
Я могу только пояснить как считает smart BASIC и на что он обращает внимание при работе с изображениями.
- Фант
- Posts: 1363
- Joined: Sat Nov 30, 2013 10:01 am
- My devices: iPad 4 (iOS 9.3), iMac (MAC OS 11.03)
- Location: Россия,Санкт-Петербург
- Flag:
- Contact:
Re: Масштабирование под разные экраны
В том то и дело-нет у меня этих девайсов. Если бы они были-этих вопросов бы у меня не былоMr. Kibernetik wrote: ↑Sun Jun 11, 2017 3:01 pmЗапросто. Выполните на этих девайсах функцию SCREEN_SCALE() и увидите какой там коэффициент.
- Фант
- Posts: 1363
- Joined: Sat Nov 30, 2013 10:01 am
- My devices: iPad 4 (iOS 9.3), iMac (MAC OS 11.03)
- Location: Россия,Санкт-Петербург
- Flag:
- Contact:
Re: Масштабирование под разные экраны
Прошу пользователей оказать помощь! Нужна проверка характеристик экрана разных устройств. (Особенно интересуют iPhone 5,5s,6,6+ и iPad pro,ipad air,ipad mini 2-4
Запустите программку и сделайте скрин экрана.
Так же прошу добавить скрин изображения 1".jpg", который получится после запуска программы.
Запустите программку и сделайте скрин экрана.
Так же прошу добавить скрин изображения 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
- Attachments
-
- Скрин экрана iPad4
- IMG_5565.PNG (178.23 KiB) Viewed 4779 times
-
- Скрин изображения 1.jpg
- IMG_5564.PNG (225.96 KiB) Viewed 4779 times
-
- Posts: 167
- Joined: Wed Oct 22, 2014 3:26 pm
- My devices: iPhone 4 to 6+,iPad mini to iPad air 2
Re: Масштабирование под разные экраны
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
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
- Attachments
-
- iPhone 6+, ios 11 beta
- IMG_5239.PNG (224.63 KiB) Viewed 4770 times
- Фант
- Posts: 1363
- Joined: Sat Nov 30, 2013 10:01 am
- My devices: iPad 4 (iOS 9.3), iMac (MAC OS 11.03)
- Location: Россия,Санкт-Петербург
- Flag:
- Contact:
Re: Масштабирование под разные экраны
В реале получается, что девайс сохраняет изображение в масштабе своего экрана и со своим dpi, поэтому при отображении изображения опять в том же спрайте никаких искажений не наблюдается. Получается xcod масштабирует не верно.
- Mr. Kibernetik
- Site Admin
- Posts: 4786
- Joined: Mon Nov 19, 2012 10:16 pm
- My devices: iPhone, iPad, MacBook
- Location: Russia
- Flag: