На этом шаге рассмотрим пример изменения яркости изображения.
Данные растрового изображения хранятся в объектах класса QImage построчно, и в каждой строке пикселы расположены слева направо.
С помощью метода scanLine() можно получить адрес строки, номер которой соответствует значению, переданному в этот метод. Имеет смысл передавать в него индексы строк, лежащие в диапазоне от 0 до высоты растрового изображения, уменьшенного на единицу. Проиллюстрируем использование этого метода на небольшом примере и реализуем функцию brightness(), которая будет уменьшать либо увеличивать яркость растровых изображений. Результаты действий этой функции показаны на рис. 1.
Рис.1. Пример изменения яркости изображения
/*Функция brightness() принимает два параметра, первый — это растровое изображение, второй — это значение яркости*/ QImage brightness(const QImage& imgOrig, int n) { //создаем для дальнейших изменений копию объекта imgOrig QImage imgTemp = imgOrig; //получаем размеры объекта imgTemp вызовом методов width() и height() qint32 nHeight = imgTemp.height(); qint32 nWidth = imgTemp.width(); //цикл перебора строк от 0 до height() for (qint32 y = 0; y < nHeight; ++y) { //вызываем метод scanLine() и устанавливаем на строку указатель tempLine QRgb* tempLine = reinterpret_cast<QRgb*>(imgTemp.scanLine(y)); //идем вдоль строки до значения width() for (qint32 x = 0; x < nWidth; ++x) { /*вызовом методов qRed(), qGreen(), qBlue() опрашиваем значение компонент RGB и вычисляем новые значения прибавляя к ним значения яркости, переданной в переменной n. Эти значения хранятся в промежуточных переменных r, g, b и a*/ int r = qRed(*tempLine) + n; int g = qGreen(*tempLine) + n; int b = qBlue(*tempLine) + n; //значения альфа-канала оставляем неизменным int a = qAlpha(*tempLine); /*присваиваем значению, на которое указывает указатель строки (tempLine), новое значение QRgb, для этого мы вызываем функцию qRgba() и устанавливаем в ней вычисленные нами значения с учетом того, чтобы они не выходили за диапазон от 0 до 255. И увеличиваем наш указатель строки на единицу, тем самым перемещаемся вдоль нее на следующий пиксел*/ *tempLine++ = qRgba(r > 255 ? 255 : r < 0 ? 0 : r, g > 255 ? 255 : g < 0 ? 0 : g, b > 255 ? 255 : b < 0 ? 0 : b, a ); } } //возвращаем из функции получившийся объект растрового изображения imgTemp return imgTemp; } int main(int argc, char** argv) { QApplication app(argc, argv); app.setApplicationDisplayName("Яркость изображения"); //в основной программе загружаем файл растрового изображения image.png QImage img("image.png"); QWidget wgt; QHBoxLayout* phbx = new QHBoxLayout; phbx->setMargin(0); phbx->setSpacing(0); //запускаем цикл, который создает новые виджеты надписей for (int i = 150; i > -150; i -= 50) { QLabel* plbl = new QLabel; plbl->setFixedSize(img.size()); /*вызовом метода setPixmap() устанавливаем новые изображения, созданные функцией brightness() с различными значениями яркости*/ plbl->setPixmap(QPixmap::fromImage(brightness(img, i))); /*виджеты надписей размещаются в горизонтальном порядке вызовом метода addWidget()*/ phbx->addWidget(plbl); } wgt.setLayout(phbx); wgt.show(); return app.exec(); }
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим примеры вывода растрового изображения.