9

.netのLinearGradientBrush(またはGDI +全体でも?)には重大なバグがあるようです。アーティファクトが発生することがあります。(ここまたはここを参照してください-基本的に、線形グラデーションの最初の線はエンドカラーで描画されます。つまり、白から黒へのグラデーションは黒の線で始まり、次に適切な白から黒のグラデーションで始まります)

誰かがこれの回避策を見つけたのだろうか?これは本当に厄介なバグです:-(

これがアーティファクトの写真です。2つのLinearGradientBrushesがあることに注意してください。

代替テキストhttp://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg

4

5 に答える 5

9

グラデーションブラシを使用しているときにもこれに気づきました。私が持っている唯一の効果的な回避策は、それでペイントされる領域よりもすべてのエッジで常に1ピクセル大きいグラデーションブラシの長方形を作成することです。これにより、4つのエッジすべての問題から保護されます。欠点は、エッジで使用される色が指定した色からわずかに外れることですが、これは描画アーティファクトの問題よりも優れています。

于 2008-09-21T02:55:46.460 に答える
5

長方形で優れた Inflate(int i) メソッドを使用して、より大きなバージョンを取得できます。

于 2008-09-21T03:05:14.720 に答える
3

上記のPhilの回答をフィネスします(これは実際にはコメントですが、私にはその特権がありません)。私が見た動作は、次のように述べているドキュメントに反しています。

開始線は方向線に垂直で、長方形の角の 1 つを通過します。開始線上のすべての点が開始色です。次に、終了線は方向線に垂直で、長方形の角の 1 つを通過します。終了ライン上のすべての点が終了色です。

つまり、場合によっては単一ピクセルのラップアラウンドが発生します。私が知る限り(実験による)、長方形の幅または高さが奇数の場合にのみ問題が発生します。したがって、バグを回避するには、(拡張前の) 次元が奇数の場合に限り、LinearGradientBrush の四角形を 1 ピクセル増やすだけで十分であることがわかりました。つまり、ブラシの四角形は常に、幅と高さの両方で次の偶数ピクセル分だけ丸めます。

したがって、長方形を塗りつぶすには、次のrようなものを使用します。

Rectangle gradientRect = r;
if (r.Width % 2 == 1)
{
    gradientRect.Width += 1;
}
if (r.Height % 2 == 1)
{
    gradientRect.Height += 1;
}
var lgb = new LinearGradientBrush(gradientRect, startCol, endCol, angle);
graphics.FillRectangle(lgb, r);

非常識だが真実。

于 2012-12-05T17:42:52.380 に答える
1

少なくとも WPF を使用すると、GradientStops を使用して、オーバーペイントした場合でも、エッジで 100% 正しい色を取得できます。

于 2008-10-22T22:11:36.853 に答える