На этом шаге рассмотрим примеры вывода растрового изображения.
Объект класса 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 в качестве контекста рисования.