Вопрос

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

Интересно, нашел ли кто-нибудь рабочий обходной путь для этой проблемы?Это очень досадная ошибка :-(

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

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

Это было полезно?

Решение

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

Другие советы

Вы можете использовать хороший метод Inflate(int i) для прямоугольника, чтобы получить большую версию.

Я бы уточнил ответ Фила выше (это действительно комментарий, но у меня нет такой привилегии).Поведение, которое я вижу, противоречит документация, в котором говорится:

Стартовая линия перпендикулярна линии ориентации и проходит через один из углов прямоугольника.Все точки на стартовой линии имеют стартовый цвет.Тогда конечная линия перпендикулярна линии ориентации и проходит через один из углов прямоугольника.Все точки на конечной линии имеют конечный цвет.

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

Безумие, но это правда.

По крайней мере, с WPF вы можете попробовать использовать GradientStops, чтобы получить 100% правильные цвета прямо по краям, даже при перекрашивании.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top