Странное поведение LinearGradientBrush - PullRequest
1 голос
/ 16 марта 2011

Я хочу заполнить прямоугольник с помощью LinearGradientBrush. С некоторыми прямоугольниками я получаю странное поведение. Пример:

Rectangle rect = new Rectangle( 20, 20, 20, 34 );
LinearGradientMode mode = LinearGradientMode.Vertical;
Brush brush = new LinearGradientBrush( rect, Color.White, Color.Blue, mode );
e.Graphics.FillRectangle( brush, rect );

Большинство прямоугольников работают нормально, но некоторые (например, выше) заполняют первую строку пикселей вторым цветом (в данном случае синим). Смотрите прикрепленное изображение:

Linear GradientBrush

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2016

Проблема заключается в ошибке в реализации Fill () в MS: когда вы думаете, что берете кисть и применяете ее в некоторой точке (X, Y), MS работает с противоположной стороны: они принимают смещение Y и считают остаток от деления по высоте кисти.Это напоминание становится смещенным внутри кисти, чтобы получить цвет.Другими словами, холст, на котором вы рисуете, становится мозаичным с помощью кисти с абсолютным смещением 0. Поэтому, если вы рисуете градиент в позиции Y = 7, цвет для градиента также берется (из кисти) со смещением 7 (вместо 0)!

2 голосов
/ 16 марта 2011

Сделать кисть на один пиксель выше:

LinearGradientMode mode = LinearGradientMode.Vertical;
Rectangle BrushRect = rect;
BrushRect.Inflate(0, 1);
Brush brush = new LinearGradientBrush(BrushRect, Color.White, Color.Blue, mode);
...