2012-03-30 2 views
3

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

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

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

+1

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

+0

Вот чего я боялся. Теперь я думаю о простом создании прозрачного изображения с тенями/второстепенными деталями в черном и наложением его на желаемый цвет/цвет, так как мне нужно всего лишь до 5 цветов. – giraffee

ответ

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)
+0

или еще лучше: вы начинаете с 256-цветного изображения с Format_Indexed8 в формате изображения, который поддерживает это (например, gif или png), и помещайте это изображение в свой qrc – hmuelner

+0

Это не ИМО - хорошее решение, потому что в большинстве случаев изменение изображения на индексированный не является вариантом из-за потери верности и т. д. –

2

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

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

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

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

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

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

Смежные вопросы