LinearGradientBrush Артефакт Обходной путь?

Кажется, что LinearGradientBrush в .net (или даже в GDI + в целом?) Имеет серьезную ошибку: иногда он вводит артефакты. (УвидетьВот или жеВот - по существу, первая линия линейного градиента рисуется в конечном цвете, то есть градиент от белого к черному начнется с черной линии, а затем с надлежащим градиентом от белого к черному)

Интересно, нашел ли кто-нибудь рабочий способ для этого? Это действительно раздражающая ошибка :-(

Вот изображение Артефактов, обратите внимание, что есть 2 LinearGradientBrushes:

альтернативный текст http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg

 Ed S.06 апр. 2009 г., 02:06
Круто, SO теперь появляется первым для большинства моих поисков WTF :)
 Antony16 янв. 2011 г., 01:16
Я тяну волосы за это в течение хорошего часа

Ответы на вопрос(4)

ка, чтобы получить большую версию.

 Michael Stum♦21 сент. 2008 г., 05:20
Я даже не знал эту функцию. аккуратный :)

но у меня нет такой привилегии). Поведение, которое я вижу, противоречитдокументация, который говорит:

The starting line is perpendicular to the orientation line and passes through one of the corners of the rectangle. All points on the starting line are the starting color. Then ending line is perpendicular to the orientation line and passes through one of the corners of the rectangle. All points on the ending line are the ending color.

А именно, в некоторых случаях вы получаете обтекание в один пиксель. Насколько я могу судить (экспериментально), проблема возникает только тогда, когда ширина или высота прямоугольника нечетна. Поэтому, чтобы обойти эту ошибку, я считаю, что достаточно увеличить прямоугольник 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);

Безумный, но правда.

GradientStops для получения 100% правильных цветов по краям, даже при перекраске.

Решение Вопроса

эффективный обходной путь, который у меня есть, - это всегда создавать прямоугольник кисти градиента на 1 пиксель больше по всем краям, чем область, которая будет закрашиваться им. Это защитит вас от проблемы по всем четырем сторонам. Недостатком является то, что цвета, используемые по краям, немного меньше тех, которые вы указали, но это лучше, чем проблема с артефактом рисования!

 Michael Stum♦21 сент. 2008 г., 05:14
Для моих целей это работает, и теперь артефакты наконец исчезли \ o /

Ваш ответ на вопрос