【发布时间】: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