Шаг 217.
Библиотека Qt.
Пример изменения яркости изображения

    На этом шаге рассмотрим пример изменения яркости изображения.

    Данные растрового изображения хранятся в объектах класса 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();
}

    Файлы приложения можно взять здесь.

    На следующем шаге рассмотрим примеры вывода растрового изображения.




Предыдущий шаг Содержание Следующий шаг