2011-07-04 5 views
2

QTでGDI +機能をいくつか実装する必要があります。特に、LinearGradientBrushです。私が困っている唯一の方法はSetGammaCorrectionです。 MSDNにはGDI +ガンマ補正アルゴリズムの詳細な説明がありますが、見つけられませんでした。QTでGDI +ガンマ補正をシミュレートする

1)我々は、2つの色の補間を持つ単純なLinearGradientBrushがあると仮定:

私は次のようにガンマ補正をシミュレートしようとしました。これら2つの色の間隔を、各点間の距離が等しい所定の数の点(100)に分割します。

2)各ポイントに値を割り当てます。第一点は、第二、0の値を有するであろう - 0.01、...、最後の点は、1

3の値を有する)の各点で補間色値を計算する:

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

開始色と終了色は、十分に明確でない場合は、勾配境界色です。

4)は、2つの境界の色を除いて算出した各色値(上の実際のガンマ補正を行う):ガンマの

gamma_corrected_color_value = color_value^(1/gamma); 

値は2.2です。

次に、QLinearGradientを取り、計算された色とその位置(ポイント値)でグラデーションストップの配列を作成し、それらのストップをグラデーションに割り当て、最後にこのグラデーションを使ってQBrushを作成します。

このブラシで矩形を塗りつぶすと、実際のGDI + LinearGradientBrushの結果にかなり近い結果が得られますが、同じではありません。私は、ガンマ値とセグメント数の異なる組み合わせを試しましたが、ほぼ同等の勾配を得ることはできませんでした。

GDI +でガンマ補正がどのように実装されているか、またはQTでどのようにシミュレートするかを知っている人はいますか?

ありがとう、トニー。

+0

結果はどれくらい離れていますか?マイクロソフトはsRGBの創始者の一人であり、多分まっすぐなガンマ関数ではなくその式を使用していました。 –

答えて

0

Qt勾配は線形であり、γは非線形である。ガンマがグラデーションのパラメータになるのではなく、ガンマが変わるたびにグラデーションを再生成しなければならないように見えます。

+0

ええ、これはそれが動作する方法です。しかし、グラデーション生成プロセスには問題ありません。問題は、私が使用するガンマ補正アルゴリズムが、実際のGDI + LinearGradientBrushとは若干異なる結果を生成することです。私はそれらの結果の最大の類似性を達成したい。 – Tony

関連する問題