Изменение оттенка QImage/QPixmap

Я полагаю, что это скорее вопрос манипулирования графикой в ​​целом, но я хотел бы выполнить это в Qt (С++). Если у меня есть изображение — скажем, круг на прозрачном фоне — светло-серого цвета, есть ли в Qt встроенная функциональность для изменения оттенка/насыщенности для его окрашивания?

Я полагаю, что мог бы идти пиксель за пикселем и математически изменять rgb - добавлять x к r, g и b, чтобы получить желаемый цвет, но должен быть лучший способ, чем изменение каждого отдельного пикселя.

Ничто в Qt Docs не заходит так далеко в манипулировании изображениями, просто изменяя альфу и цвета. Должен ли я изучить библиотеку с открытым исходным кодом (конечным результатом, скорее всего, будет независимое программное обеспечение)? Если да, то есть ли рекомендации? Или есть секретная функция, скрытая в документах Qt, которая может выполняться без необходимости использования внешних библиотек/сумасшедших алгоритмов?


person giraffee    schedule 30.03.2012    source источник
comment
В конечном счете, любая функция в любой библиотеке должна будет перебирать каждый пиксель и модифицировать его. Если вам не нужны различные функции обработки изображений, будет проще написать их самостоятельно. Работа с оттенком/насыщенностью немного сложнее, чем добавление значений RGB; если вы что-то пишете сами, я предлагаю вам взглянуть на преобразование HSV в RGB: en.wikipedia. org/wiki/HSL_and_HSV#Converting_to_RGB   -  person kappamaki    schedule 30.03.2012
comment
Вот чего я боялся. Сейчас я думаю просто создать прозрачное изображение с тенями/второстепенными деталями в черном цвете и наложить его на желаемый цвет/цвета, так как мне понадобится всего до ~ 5 цветов.   -  person giraffee    schedule 30.03.2012


Ответы (4)


Возможный ход действий:

  1. Загрузите свое изображение как QImage
  2. Сделайте QImage QImage::convertToFormat(QImage::Format_Indexed8), чтобы получить проиндексированное изображение с таблицей цветов.
  3. Получить значения таблицы цветов с помощью QRgb QImage::color ( int i ) const
  4. Управляйте цветами с помощью QColor ( QRgb color ) и других методов QColor.
  5. Измените таблицу цветов с помощью void QImage::setColor ( int index, QRgb colorValue )
person Chris Browet    schedule 30.03.2012
comment
или еще лучше: вы начинаете с 256-цветного изображения с Format_Indexed8 в формате изображения, который поддерживает это (например, gif или png) и помещаете это изображение в свой qrc - person hmuelner; 30.03.2012
comment
Это не IMO хорошее решение, потому что в большинстве случаев изменение изображения на индексированное не вариант из-за потери точности и т. д. - person Lennart Rolland; 02.01.2016
comment
Вам не нужно конвертировать - это портит изображение! Просто используйте QImage::pixelColor/setPixelColor. - person Alexander Dyagilev; 09.01.2021
comment
QImage — это растровое изображение. Вы просто меняете формат пикселей, здесь вы не сжимаете что-то вроде jpg или png. Почти уверен, что ваше решение будет работать, но будет чертовски медленным (см. предупреждение о дороговизне QImage::setPixelColor) - person Chris Browet; 10.01.2021

У вас есть несколько вариантов, ни один из которых, к сожалению, не является встроенным решением Qt.

  1. Используйте OpenMP или какую-либо другую библиотеку параллелизма, чтобы воспользоваться преимуществами SSE/SSE2.
  2. Используйте графический процессор через OpenGL, DirectX или различные методы программирования GPGPU.
  3. (решение, которое я выбрал) Используйте OpenCL, чтобы воспользоваться преимуществами параллелизма как ЦП, так и ГП без всяких "веселых программирования шейдеров.
  4. Создайте пул рабочих потоков и попросите каждого из них обрабатывать часть изображения.

Мое приложение выполняет большую фильтрацию изображений, и я был искренне шокирован приростом производительности, который должен был быть получен после того, как я перенес фильтры на OpenCL. .

При разрешении 1936×2592 фильтр изменения яркости работал за 175 мс в собственном коде C++, перебирая каждый пиксель в QImage.

После переноса на OpenCL это время сократилось до 15 мс. Конечно, данные приходилось извлекать из QImage и вставлять заново, но эти накладные расходы были ничто по сравнению с приростом производительности OpenCL.

Желаем удачи в ваших приключениях по программированию!

person PhotoMonkee    schedule 09.06.2012

В этом случае кажется, что вам может сойти с рук использование QGraphicsColorizeEffect.

Вместо смещения оттенка этот метод установит его. Хотя кажется, что QGraphicsEffects можно применить только к QWidgets и QGraphicsItems, что может быть неудобно.


Другой вариант — в данном случае — использовать CompositionMode QPainter. а>.

person 魔大农    schedule 23.10.2020

Просто используйте QImage::pixelColor и QImage::setPixelColor (доступно с Qt 5.6).

person Alexander Dyagilev    schedule 09.01.2021