我需要在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。
答案 0 :(得分:0)
Qt梯度是线性的,伽马是非线性的。看起来你必须在伽玛改变时重新生成渐变 - 而不是让伽玛成为渐变的参数。