Странное поведение LinearGradientBrush

Я хочу заполнить прямоугольник 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 );

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

Линейная градиентная кисть

Любые идеи?


person EricSchaefer    schedule 16.03.2011    source источник
comment
Более поздний, лучший ответ был опубликован здесь gdi net lineargradientbrush шире 202 пикселей вызывает перенос цвета"> stackoverflow.com/questions/8015656/   -  person Jake    schedule 20.08.2012


Ответы (2)


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

LinearGradientMode mode = LinearGradientMode.Vertical;
Rectangle BrushRect = rect;
BrushRect.Inflate(0, 1);
Brush brush = new LinearGradientBrush(BrushRect, Color.White, Color.Blue, mode);
person Steve Wellens    schedule 16.03.2011
comment
Хорошая идея. Это исправляет это. Но знаете ли вы, почему это вообще происходит? - person EricSchaefer; 16.03.2011

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

person Vincent    schedule 11.04.2016