Russian Qt Forum
Апрель 19, 2024, 12:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Mac os] Отрисовать снимок экрана на окне  (Прочитано 6113 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Февраль 25, 2015, 14:45 »

Стоит банальная задача, получить скриншот экрана и отрисовать его целиком на окне. Все работает хорошо до тех пор пока мы не сталкиваемся с ретина дисплеем.

При работе с ним творятся чудеса. Скриншот с экрана, получается размером 2560x1600, при этом если мы растянем окно на весь монитор, оно будет размером 1280x800. Такая вот дивная метаморфоза.

Отсюда сталкиваемся с проблемой отрисовки. Без искажения можем отрисовать только четверть картинки. Если ресайзим изображение то получаем очень плохое качество т.к. картинка уживается в два раза.

Кто сталкивался с подобной задачей на ретине?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Февраль 25, 2015, 15:26 »

это нативный код так странно снимает скриншоты?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Февраль 25, 2015, 15:31 »

И нативный и Qt.

Нативный код такой
Код:
CGDirectDisplayID displayId = CGMainDisplayID()
CGImage imageRef = CGDisplayCreateImage(displayId)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Февраль 25, 2015, 15:42 »

Цитировать
Remember That Quartz Display Services Returns CGImage Objects Sized in Pixels

CGImage objects are always sized in pixels; they do not contain any metadata concerning the drawing size in points. So if you access the screen pixels to create an image using the functions CGDisplayCreateImage or CGDisplayCreateImageForRect, you’ll need to know whether the display is running in standard- or high-resolution mode to properly interpret what the pixel size means. If the display is running in high-resolution mode, the images will have a 2x backing store.
может че-нить найдешь тут полезное: https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Introduction/Introduction.html#//apple_ref/doc/uid/TP40012302-CH1-SW1
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Февраль 25, 2015, 22:19 »

На девайсах с retina дисплеем device pixel ratio равен 2.0 (на iPhone 6 plus равен 3.0). В данном случае, чтобы корректно отрисовать изображение, нужно учесть этот device pixel ratio:

Код
C++ (Qt)
QPixmap foo("foo.png");
foo.setDevicePixelRatio(qApp->devicePixelRatio());
.....
 
painter.drawPixmap(x, y, foo);

Также нужно установить атрибут AA_UseHighDpiPixmaps:

Код
C++ (Qt)
qApp->setAttribute(Qt::AA_UseHighDpiPixmaps);

Qt 5.3.2, Qt 5.4.0

Подробнее можно почитать здесь: http://blog.qt.io/blog/2013/04/25/retina-display-support-for-mac-os-ios-and-x11/
« Последнее редактирование: Февраль 25, 2015, 22:23 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Февраль 26, 2015, 12:39 »

pastor, спасибо, покопал в эту сторону. Если задать флаг

Код:
qApp->setAttribute(Qt::AA_UseHighDpiPixmaps);

изменения действительно есть.

1. Иконка в трее почему то, становится чуть больше.
2. Изображение отрисовывается по размерам окна, но тоже было плохого качества.

Проблему победить удалось.

Я в качестве окна для рисования использую QDeclarativeView, у него использую функцию drawBackground. В этой функции естественно и рисовал background.

При этом заметил если я в qml создаю Image, растягиваю на весь экран и задаю туда картинку, она отображается хорошо, но при рисовании в drawBackground она получается замыленая. Решил стянуть функцию рисования из QDeclrativeImage, стянул, не помогло. В итоге у QDeclarativeView убрал флаг setCacheMode(QDeclarativeView::CacheBackground) и все стало рисоваться хорошо.

Как то так. Всем спасибо  Улыбающийся
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #6 : Февраль 26, 2015, 13:09 »

Кстати, забыл рассказать про размеры. Почему получаются разные размеры у окна и у картинки. На самом деле все просто. Картинка всегда возвращает размеры в пикселях, в то время как окно возвращает размер в point по крайней мере под маком, а так как это разные единицы измерения они не всегда могут быть равны, как в случае с ретиной, там получается в 1 point попадает 4ре пикселя, 2 по ширине, 2 по высоте. Если я все верно понял.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Февраль 26, 2015, 13:13 »

Вот есть неплохая статья по поводу размеров экрана:

http://www.kylejlarson.com/blog/2015/iphone-6-screen-size-web-design-tips/
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #8 : Февраль 26, 2015, 14:02 »

Спасибо, очень годная статья
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 22.