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