2

QTにいくつかのGDI+機能、特にLinearGradientBrushを実装する必要があります。私が問題を抱えている唯一の方法はSetGammaCorrectionです。MSDNにはGDI+ガンマ補正アルゴリズムのかなり詳細な説明があるというトピックを見つけましたが、見つかりませんでした。

私は次のようにガンマ補正をシミュレートしようとしました:

1)2色補間を使用した単純なLinearGradientBrushがあるとします。これらの2つの色の間の間隔を、各ポイント間の距離が等しい事前定義された数のポイント(100)に分割します。

2)各ポイントに値を割り当てます。最初のポイントの値は0、2番目のポイントの値は-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でそれをシミュレートする方法を知っている人はいますか?

ありがとう、トニー。

4

1 に答える 1

0

Qt勾配は線形であり、ガンマは非線形です。ガンマをグラデーションのパラメータにするのとは対照的に、ガンマが変更されるたびにグラデーションを再生成する必要があるようです。

于 2011-07-04T12:08:12.220 に答える