Изменение оттенка QImage / QPixmap - PullRequest
5 голосов
/ 30 марта 2012

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

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

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

Ответы [ 2 ]

6 голосов
/ 30 марта 2012

Возможный курс действий:

  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 )
2 голосов
/ 09 июня 2012

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

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

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

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

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

Удачи в ваших приключениях!

...