Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Февраль 25, 2015, 14:45



Название: [Mac os] Отрисовать снимок экрана на окне
Отправлено: ecspertiza от Февраль 25, 2015, 14:45
Стоит банальная задача, получить скриншот экрана и отрисовать его целиком на окне. Все работает хорошо до тех пор пока мы не сталкиваемся с ретина дисплеем.

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

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

Кто сталкивался с подобной задачей на ретине?


Название: Re: [Mac os] Отрисовать снимок экрана на окне
Отправлено: kambala от Февраль 25, 2015, 15:26
это нативный код так странно снимает скриншоты?


Название: Re: [Mac os] Отрисовать снимок экрана на окне
Отправлено: ecspertiza от Февраль 25, 2015, 15:31
И нативный и Qt.

Нативный код такой
Код:
CGDirectDisplayID displayId = CGMainDisplayID()
CGImage imageRef = CGDisplayCreateImage(displayId)


Название: Re: [Mac os] Отрисовать снимок экрана на окне
Отправлено: kambala от Февраль 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


Название: Re: [Mac os] Отрисовать снимок экрана на окне
Отправлено: pastor от Февраль 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/


Название: Re: [Mac os] Отрисовать снимок экрана на окне
Отправлено: ecspertiza от Февраль 26, 2015, 12:39
pastor, спасибо, покопал в эту сторону. Если задать флаг

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

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

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

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

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

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

Как то так. Всем спасибо  :)


Название: Re: [Mac os] Отрисовать снимок экрана на окне
Отправлено: ecspertiza от Февраль 26, 2015, 13:09
Кстати, забыл рассказать про размеры. Почему получаются разные размеры у окна и у картинки. На самом деле все просто. Картинка всегда возвращает размеры в пикселях, в то время как окно возвращает размер в point по крайней мере под маком, а так как это разные единицы измерения они не всегда могут быть равны, как в случае с ретиной, там получается в 1 point попадает 4ре пикселя, 2 по ширине, 2 по высоте. Если я все верно понял.


Название: Re: [Mac os] Отрисовать снимок экрана на окне
Отправлено: pastor от Февраль 26, 2015, 13:13
Вот есть неплохая статья по поводу размеров экрана:

http://www.kylejlarson.com/blog/2015/iphone-6-screen-size-web-design-tips/


Название: Re: [Mac os] Отрисовать снимок экрана на окне
Отправлено: ecspertiza от Февраль 26, 2015, 14:02
Спасибо, очень годная статья