Имитация GDI + гамма-коррекция в QT - PullRequest
2 голосов
/ 04 июля 2011

Мне нужно реализовать некоторые функциональные возможности GDI + в QT, в частности, LinearGradientBrush .Единственный метод, с которым у меня проблемы - это SetGammaCorrection .Я нашел тему, в которой упоминалось, что в MSDN есть довольно подробное описание алгоритма гамма-коррекции GDI +, но я не смог его найти.

Я попытался смоделировать гамма-коррекцию следующим образом:

1) Предположим, у нас есть простая LinearGradientBrush с двухцветной интерполяцией.Разделите интервал между этими двумя цветами на заранее определенное количество точек (100) с равным расстоянием между каждой точкой.

2) Присвойте значение каждой точке.Первая точка будет иметь значение 0, вторая - 0,01, ..., последняя точка будет иметь значение 1.

3) Рассчитать интерполированное значение цвета в каждой точке:

current_color = start_color * (1 - current_point_value) + end_color * current_point_value;

Начальный цвет и конечный цвет - это цвета градиента, если он не был достаточно четким.

4) Выполните фактическую гамма-коррекцию для каждого вычисленного значения цвета (кроме двух граничных цветов):

gamma_corrected_color_value = color_value ^ (1 / gamma);

Значение гаммы равно 2.2.

Затем я беру QLinearGradient, создаю массив градиентных остановок с вычисленными цветами и их позициями (значениями точек), назначаю эти остановки градиенту инаконец, создайте QBrush с этим градиентом.

Теперь, если я закрашиваю прямоугольник этой кистью, я получаю результат, довольно близкий к результату фактического GDI + LinearGradientBrush, но они не совпадают.Я пробовал разные комбинации значений гаммы и количества сегментов, но мне не удалось получить почти равные градиенты.

Кто-нибудь знает, как реализована гамма-коррекция в GDI + или как смоделировать ее в QT?

Спасибо, Тони.

1 Ответ

0 голосов
/ 04 июля 2011

Qt градиенты линейные, гамма нелинейная.Похоже, вам придется регенерировать градиент всякий раз, когда изменяется гамма - в отличие от того, чтобы гамма была параметром градиента.

...