На этом шаге рассмотрим примеры вывода растрового изображения.
Объект класса QImage можно отобразить в контексте рисования методом QPainter::drawImage(). Перед тем как отобразить объект QImage на экране, метод drawImage() преобразует его в контекстно-зависимое представление (объект класса QPixmap). Приведем пример вывода изображения с позиции (0, 0) (рис. 1).
Рис.1. Пример вывода изображения в контексте рисования
QPainter painter(this); QImage img("Snowleo.jpg"); painter.drawImage(0, 0, img);
Файлы приложения можно взять здесь.
Если необходимо вывести только часть растрового изображения, то необходимо указать эту часть в дополнительных параметрах метода drawImage(). Приведем пример отображения участка растрового изображения, задаваемого координатой (300, 0) и имеющей ширину равной 180, а высоту — 220 пикселам (рис. 2).
Рис.2. Пример вывода части изображения
QPainter painter(this); QImage img("Snowleo.jpg"); painter.drawImage(50, 10, img, 300, 0, 180, 220);
Файлы приложения можно взять здесь.
Вызвав метод invertPixels() и передав в него значение QImage::InvertRgb, можно управлять инвертированием пикселов. А передача значения QImage::InvertRgba позволяет инвертировать не только пикселы, но и альфа-канал. Приведем пример реализации этой возможности, показанный на рис. 3.
Рис.3. Пример инвертирования пикселов
QPainter painter(this); QImage img("Snowleo.jpg"); painter.drawImage(10, 10, img, 300, 0, 180, 220); img.invertPixels(QImage::InvertRgb); painter.drawImage(200, 10, img, 300, 0, 180, 220);
Файлы приложения можно взять здесь.
При помощи метода scaled() можно получить новое растровое изображение с измененными размерами. Действие флагов Qt::IgnoreAspectRatio и Qt::KeepAspectRatio, управляющих изменением размеров, рассмотрено в шаге 185. Приведем пример изменения размеров растрового изображения, показаный на рис. 4.
Рис.4. Пример изменения размера изображения
QPainter painter(this); QImage img1("Snowleo.jpg"); painter.drawImage(0, 0, img1); QImage img2 = img1.scaled(img1.width() / 2, img1.height(), Qt::IgnoreAspectRatio); painter.drawImage(img1.width(), 0, img2); QImage img3 = img1.scaled(img1.width(), img1.height() / 2, Qt::IgnoreAspectRatio); painter.drawImage(0, img1.height(), img3); QImage img4 = img1.scaled(img1.width() / 2, img1.height(), Qt::KeepAspectRatio); painter.drawImage(img1.width(), img1.height(), img4);
Файлы приложения можно взять здесь.
Класс QImage предоставляет возможность горизонтального или вертикального отражения растрового изображения. Для этого в метод mirrored() необходимо передать два булевых значения, управляющих горизонтальным и вертикальным отражениями соответственно. Метод mirrored() не изменяет растровое изображение объекта, из которого он был вызван, а создает новое. Результат показан на рис. 5.
Рис.5. Пример отражения изображения
QPainter painter(this); QImage img("Snowleo.jpg"); painter.drawImage(0, 0, img); painter.drawImage(0, img.height(),img.mirrored(false, true));
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим использование объекта класса QImage в качестве контекста рисования.