【问题标题】:Simulating GDI+ gamma correction in QT在 QT 中模拟 GDI+ 伽马校正
【发布时间】:2011-09-28 01:27:09
【问题描述】:

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

我尝试如下模拟伽马校正:

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

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

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

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

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

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

gamma_corrected_color_value = color_value ^ (1 / gamma);

gamma 的值为 2.2。

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

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

有谁知道 GDI+ 中的 gamma 校正是如何实现的,或者如何在 QT 中模拟它?

谢谢,托尼。

【问题讨论】:

  • 您的结果离我们还有多远?微软是 sRGB 的鼻祖之一,也许他们使用了这个公式而不是直接的 gamma 函数。

标签: qt gdi+ lineargradientbrush


【解决方案1】:

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

【讨论】:

  • 是的,这就是它的工作方式。但是梯度生成过程没有问题。问题是我使用的伽马校正算法产生的结果与实际的 GDI+ LinearGradientBrush 略有不同。我想实现这些结果的最大相似性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
相关资源
最近更新 更多