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でどのようにシミュレートするかを知っている人はいますか?
ありがとう、トニー。
結果はどれくらい離れていますか?マイクロソフトはsRGBの創始者の一人であり、多分まっすぐなガンマ関数ではなくその式を使用していました。 –