Мне нужно реализовать некоторые функциональные возможности 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?
Спасибо, Тони.