Высококачественное воспроизведение изображения при помощи QImage
Высококачественное воспроизведение изображения при помощи QImage
При рисовании мы можем столкнуться с необходимостью принятия компромиссных решений относительно скорости и точности. Например, в системах X11 и Mac OS X рисование по виджету QWidget или по пиксельной карте QPixmap основано на применении родного для платформы графического процессора (paint engine). В системе X11 это обеспечивает минимальную связь с Х—сервером; посылаются только команды рисования, а не данные реального изображения. Основным недостатком этого подхода является то, что возможности Qt ограничиваются родными для данной платформы средствами поддержки:
• в системе Х11 такие возможности, как сглаживание линий и поддержка дробных координат, доступны только в том случае, если Х—сервер использует расширение X Render;
• в системе Mac OS X родной графический процессор, обеспечивающий сглаживание линий, использует алгоритмы рисования многоугольников, которые отличаются от алгоритмов в X11 и Windows, что приводит к получению немного других результатов.
Когда точность важнее эффективности, мы можем рисовать по QImage и копировать результат на экран. В этом случае Qt всегда использует собственный внутренний графический процессор и результат на всех платформах получается идентичным. Единственное ограничение заключается в том, что QImage, по которому мы рисуем, должен создаваться с аргументом QImage::Format_RGB32 или QImage::Format_ARGB32_Premultiplied.
Второй формат почти идентичен обычному формату ARGB32 (0xaarrggbb); отличие в том, что красный, зеленый и синий компоненты «предварительно умножаются» на альфа—компонент. Это значит, что значения RGB, которые обычно находятся в диапазоне от 0x00 до 0xFF, теперь принимают значения от 0x00 до значения альфа-компонента. Например, синий цвет с прозрачностью 50% представляется значением 0x7F0000FF в формате ARGB32, но он имеет значение 0x7F00007F в формате ARGB32 с предварительным умножением компонент, и, аналогично, темно-зеленый цвет с прозрачностью 75% имеет значение 0x3F008000 в формате ARGB32 и значение 0x3F002000 в фopмaтe ARGB32 с предварительным умножением компонент.
Предположим, что мы хотим использовать сглаживание линий при рисовании виджета и нам нужно получить хорошие результаты даже в системах X11, которые не используют расширение X Render. Обработчик событий paintEvent(), предполагающий применение X Render для сглаживания линий, мог бы выглядеть следующим образом:
01 void MyWidget::paintEvent(QPaintEvent *event)
02 {
03 QPainter painter(this);
04 painter.setRenderHint(QPainter::Antialiasing, true);
05 draw(&painter);
06 }
Ниже показано, как можно переписать виджетную функцию paintEvent() для применения независимого от платформы графического процессора Qt:
01 void MyWidget::paintEvent(QPaintEvent *event)
02 {
03 QImage image(size(), QImage::Format_ARGB32_Premultiplied);
04 QPainter imagePainter(&image);
05 imagePainter.initFrom(this);
06 imagePainter.setRenderHint(QPainter::Antialiasing, true);
07 imagePainter.eraseRect(rect());
08 draw(&imagePainter);
09 imagePainter.end();
10 QPainter widgetPainter(this);
11 widgetPainter.drawImage(0,0, image);
12 }
Мы создаем объект QImage с тем же размером, который имеет виджет, в формате ARGB32 с умножением компонент, и объект QPainter для рисования по изображению. Вызов initFrom() инициализирует в рисовальщике перо, фон и шрифт значениями, используемыми виджетом. Мы рисуем, используя QPainter как обычно, а в конце еще раз используем объект QPainter для копирования изображения на виджет.
Этот подход дает одинаково высококачественный результат на всех платформах, за исключением воспроизведения шрифта, что зависит от установленных в системе шрифтов.
Особенно эффективным средством графического процессора Qt является его поддержка режимов композиции. Эти режимы определяют способ слияния исходного и нового пикселя при рисовании. Это относится ко всем операциям рисования, в том числе относящимся к перу, кисти, градиенту и изображению.
Режимом композиции по умолчанию является QImage::CompositionMode_SourceOver, означающий, что исходный пиксель (тот, который рисуется в данный момент) налагается поверх существующего на изображении пикселя, причем альфа—компонент исходного пикселя определяет степень его прозрачности. На рис. 8.11 показан результат рисования полупрозрачной бабочки поверх тестового шаблона при использовании разных режимов.
Рис. 8.11. Режимы композиции QPainter.
Режимы композиции устанавливаются функцией QPainter::setCompositionMode(). Например, ниже показано, как можно создать объект QImage, объединяющий пиксели бабочки и тестового шаблона с помощью операции XOR:
QImage resultImage = checkerPatternImage;
QPainter painter(&resultImage);
painter.setCompositionMode(QPainter::CompositionMode_Xor);
painter.drawImage(0, 0, butterflyImage);
Следует иметь в виду, что операция QImage::CompositionMode_Xor применяется к альфа—компоненту. Это означает, что если мы применим операцию XOR при наложении белого цвета (0xFFFFFFFF) на белый цвет, мы получим прозрачный цвет (0х00000000), а не черный цвет(0хFF000000).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
gotoAndPlay - Переход на кадр и воспроизведение
gotoAndPlay - Переход на кадр и воспроизведение gotoAndPlay(Глобальная функция)Осуществляет немедленный безусловный переход на указанный кадр, а затем воспроизводит текущий клип или фильм.Синтаксис:gotoAndPlay(frameNumber)gotoAndPlay(frameLabel)gotoAndPlay(scene, frameNumber)gotoAndPlay(scene,
Play - Воспроизведение
Play - Воспроизведение Play(Глобальная функция)Воспроизведение ролика после остановкиСинтаксис:Play()Описание:При вызове функции Play() начинается последовательное воспроизведение кадров текущего главного фильма или клипа. Текущим называется фильм или клип, в котором
Воспроизведение мультимедийных файлов
Воспроизведение мультимедийных файлов Могу порекомендовать вам отличный альтернативный проигрыватель аудио-и видеофайлов, который заменяет встроенный в операционную систему Windows Media Player. Его название — JetAudio.JetAudio — это универсальный проигрыватель, который может не
5.5. Воспроизведение неподдерживаемых форматов
5.5. Воспроизведение неподдерживаемых форматов Во многих дистрибутивах Linux мы не можем воспроизвести, казалось бы, привычные форматы — DivX, Windows Media (WMV), QuickTime, DVD и в некоторых случаях даже MP3. Причина всему этому — всевозможные лицензионные соглашения, нарушения которых не
5.1.2.1. Воспроизведение МР3
5.1.2.1. Воспроизведение МР3 Разработчики Fedora обещали, что установка кодеков в восьмой версии будет реализована по принципу "одного щелчка". Попробуйте открыть в Fedora любой фильм - просто дважды щелкните в окне Обозреватель файлов на значке видеофайла. Получите картину из
5.3. Воспроизведение музыки
5.3. Воспроизведение музыки 5.3.1. Проигрыватели В Fedora 8 вам доступны два музыкальных проигрывателя (если не считать проигрывателя AudioCD) - Audacious и Rhytmbox. Вы можете установить и дополнительные проигрыватели, но в этом просто нет
Запись и воспроизведение сценариев в BITE
Запись и воспроизведение сценариев в BITE Тестировщики и разработчики в тестировании трятят значительную часть своего рабочего времени на автоматизацию больших, сквозных регрессионных тест-кейсов. Именно эти тесты показывают, могут ли все части продукта работать
14.4. Воспроизведение аудио в фоновом режиме
14.4. Воспроизведение аудио в фоновом режиме Постановка задачи Вы пишете приложение, в котором требуется воспроизводить аудио (например, обычный музыкальный плеер), и хотите, чтобы эти файлы могли воспроизводиться даже в том случае, когда это приложение работает в фоновом
Воспроизведение звука на компьютере
Воспроизведение звука на компьютере Воспроизведение цифрового звука – процесс, обратный оцифровке. Устройство, входящее в состав звуковой карты компьютера, – цифроаналоговый преобразователь (ЦАП) получает от программы-проигрывателя последовательность записей
Воспроизведение окружающего рельефа
Воспроизведение окружающего рельефа Ранее неоднократно подчеркивалось, что добавление и текстурирование поверхностей, отображающих особенности реального рельефа вокруг дома, всегда придают больше реалистичности любому проекту.Для работы с рельефом в программе ArCon
Урок 24. Воспроизведение звука
Урок 24. Воспроизведение звука Завершая вводную часть нашего учебника по ActionScript, рассмотрим использование звука. Flash может воспроизводить звуки, помещая их во временную шкалу ролика или клипа. Вы также можете запускать воспроизведение звука при помощи команд
Инструмент Запись и воспроизведение
Инструмент Запись и воспроизведение С помощью инструмента Запись и воспроизведение (см. табл. П3.3) можно записывать видеосюжеты разных планов. С помощью инструмента IW Recorder (Рекордер) происходит запись всех действий на интерактивной доске и звукового сопровождения.
13.1. Воспроизведение музыки
13.1. Воспроизведение музыки Опять «семерка» порадовала прекрасными средствами для воспроизведения музыки и видео. Вообще, проигрыватель Windows Media, используемый в Windows 7, очень напоминает свою предыдущую версию, которая использовалась в Windows Vista, однако новый проигрыватель
Воспроизведение фильмов, содержащих кнопки
Воспроизведение фильмов, содержащих кнопки Воспроизведение фильмов, содержащих кнопки, также имеет некоторые особенности. Flash способен сделать так, что мы сможем нажимать кнопки прямо во время работы над фильмом (конечно, привязанные к ним сценарии работать не будут).
Воспроизведение звука и видео
Воспроизведение звука и видео Как отмечалось ранее, для запуска проигрывателя достаточно дважды щелкнуть кнопкой мыши на значке любого файла мультимедиа, после чего воспроизведение начнется автоматически. Вы также можете выбрать файл для воспроизведения из библиотеки
Воспроизведение музыки и видео
Воспроизведение музыки и видео Если вы хотите послушать музыку или посмотреть фильм на диске, то после того, как вы установите диск, программа проигрывателя откроется автоматически, не пугайтесь и будьте к этому готовы.Если же вы знаете, где у вас в компьютере находится