在QT中模拟GDI +伽马校正

时间:2011-07-04 10:40:44

标签: qt gdi+ lineargradientbrush

我需要在QT中实现一些GDI +功能,尤其是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中模拟它?

谢谢,Tony。

1 个答案:

答案 0 :(得分:0)

Qt梯度是线性的,伽马是非线性的。看起来你必须在伽玛改变时重新生成渐变 - 而不是让伽玛成为渐变的参数。