2

我需要在 QT 中实现一些 GDI+ 功能,特别是LinearGradientBrush。我遇到麻烦的唯一方法是SetGammaCorrection。我发现一个主题提到 MSDN 对 GDI+ 伽马校正算法有非常详尽的描述,但我找不到。

我试图模拟伽玛校正如下:

1) 假设我们有一个带有双色插值的简单 LinearGradientBrush。将这两种颜色之间的间隔划分为预定义数量的点 (100),每个点之间的距离相等。

2) 为每个点分配一个值。第一个点的值为 0,第二个点的值为 0,...,最后一个点的值为 1。

3)计算每个点的插值颜色值:

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

开始颜色和结束颜色是渐变边界颜色,如果不够清晰。

4)对每个计算出来的颜色值进行实际的gamma校正(除了两个边界颜色):

gamma_corrected_color_value = color_value ^ (1 / gamma);

伽玛值为 2.2。

然后我使用 QLinearGradient,用计算的颜色及其位置(点值)制作一组渐变色标,将这些色标分配给渐变,最后用这个渐变创建一个 QBrush。

现在,如果我用这个画笔填充一个矩形,我得到的结果与实际 GDI+LinearGradientBrush 的结果非常接近,但它们并不相同。我尝试了伽玛值和段数的不同组合,但我没有设法获得几乎相等的梯度。

有谁知道如何在 GDI+ 中实现伽马校正或如何在 QT 中模拟它?

谢谢,托尼。

4

1 回答 1

0

Qt 梯度是线性的,伽玛是非线性的。看起来你将不得不在 gamma 变化时重新生成梯度——而不是让 gamma 成为梯度的参数。

于 2011-07-04T12:08:12.220 回答