我需要在QT中實現一些GDI +功能,特別是LinearGradientBrush。我唯一遇到的問題是SetGammaCorrection。我發現了一個話題,提到MSDN對GDI + gamma校正算法有非常全面的描述,但我找不到它。在QT中模擬GDI + gamma校正
我試過如下模擬伽瑪校正:
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結果的結果,但它們並不相同。我嘗試過不同的gamma值和段數組合,但我沒有設法得到幾乎相同的漸變。
有誰知道如何在GDI +中實現伽馬校正或如何在QT中模擬它?
謝謝,託尼。
你的結果有多遠?微軟是sRGB的創始人之一,也許他們使用該公式而不是直伽瑪函數。 –