PathGradientBrush
От: HotDog Швейцария www.denebspace.com
Дата: 17.06.05 21:35
Оценка:
Привет народ!

Пытаюсь залить область четырьмя цветами


GraphicsPath myPath = new GraphicsPath();
myPath.AddRectangle(e.Graphics.VisibleClipBounds);

PathGradientBrush myBrush = new PathGradientBrush(myPath);
myBrush.SurroundColors = new Color[] {Color.White, Color.Blue, Color.Black, Color.Black};

e.Graphics.FillRectangle(myBrush, e.Graphics.VisibleClipBounds);



Хочу воспроизвести следуюющую картинку



а получается




Можно этого вообще добиться с помощью PathGradientBrush?

18.06.05 18:57: Перенесено модератором из '.NET' — IT
Re: PathGradientBrush
От: krasin Россия  
Дата: 18.06.05 11:50
Оценка:
В общем, вот:

A PathGradientBrush object has a boundary path and a center point. When you fill an area with a path gradient brush, the color changes gradually as you move from the boundary path to the center point. By default, the color is linearly related to the distance.
Соответственно, по умолчанию этот центральный цвет — белый.

Следующий код дает похожий на правду результа (центральный цвет взят как среднее арифметическое угловых)

path.AddRectangle(canvas.VisibleClipBounds);
PathGradientBrush brush = new PathGradientBrush(path)
brush.CenterColor = Color.FromArgb(64, 64, 128);
brush.SurroundColors = new Color[] { Color.White, Color.Blue, Color.Black, Color.Black};
canvas.FillRectangle(brush, canvas.VisibleClipBounds);



PathGradientBrush
От: Аноним  
Дата: 17.06.05 23:13
Оценка:
Здесь проблема в том, что вы не позаботились об установке свойств PathGradientBrush.CenterPoint и PathGradientBrush.CenterColor, задающие соответственно координаты и цвет "центра масс" вашей фигуры.
По какой-то непонятной мне причине при использовании конструктора PathGradientBrush( GraphicsPath ) свойство CenterColor устанавливается в белый цвет, отсюда и ваша "странная" картинка.

Уже установка этого свойства в чёрный цвет позволяет получить картинку, достаточно близкую к тому, что вам нужно. А если вы ещё немного поиграетесь с этим свойством, то сможете получить совсем такую же.

Данная информация предоставляется на условиях «КАК ЕСТЬ», без предоставления каких-либо гарантий и прав. Используя данную информацию, вы соглашаетесь с тем, что (i) Майкрософт не несет ответственности за использование вами данной информации и (ii) вы принимаете на себя весь риск, связанный с использованием данной информации.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: PathGradientBrush
От: HotDog Швейцария www.denebspace.com
Дата: 20.06.05 07:16
Оценка:
Здравствуйте, Name, Вы писали:

N>Здесь проблема в том, что вы не позаботились об установке свойств PathGradientBrush.CenterPoint и PathGradientBrush.CenterColor,


Пробовал я и то и другое. С теми цветами что я привел в первой мессаги еще можно как то уравновесить CenterColor через среднее арифметическое и получить примерно такой результат, что и ожидался. Но если взять за угловые цвета такие как красный, синий, зеленый, желтый, то парится уже приходится неподеццки. Практически при любом раскладе пробиваются непонятные диагональные составляющие... Пробовал CenterColor и в Empty и в Transparent ставитьб убирал CenterPoint за "пределы видимости" — нифига, диагонали все равно видно.
Ну да бог с ним.. решил проблему с помошью линейного градиента.
Re[2]: PathGradientBrush
От: HotDog Швейцария www.denebspace.com
Дата: 20.06.05 07:20
Оценка:
Здравствуйте, krasin, Вы писали:

K>Следующий код дает похожий на правду результа (центральный цвет взят как среднее арифметическое угловых)


Ага, спасибо за пример, но если приглядеться то видно диагональные ребра, которые при другом цветовом раскладе еще более заметны (красный, зеленый, синий, желтый). Похоже что штатнымы средствами в один присест этого не сделать.
Пришлось делать эту заливку линейныйм градиентом. Все нормально отрисовывает, но как всегда МS не дает нам спать спокойно и со своей стороны заботится об энтертейменте в виде танцов с бубном
Re[2]: PathGradientBrush
От: Аноним  
Дата: 20.06.05 07:30
Оценка:
Если не жалко кинь сюда сорс как ты сделал.

Заранее спасибо.

-- Если тебе помогли, незабудь сказать спасибо --
-- Это всё мое личное мнение которое может не совпадать с Вашим или может быть ошибочным --

.NetCoder


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: PathGradientBrush
От: HotDog Швейцария www.denebspace.com
Дата: 21.06.05 07:51
Оценка:
Здравствуйте, dotnetcoder, Вы писали:

D>Если не жалко кинь сюда сорс как ты сделал.



Примерно так

        public Bitmap SoftFill(int width, int height, Color c1, Color c2, Color c3, Color c4)
        {
            Bitmap _result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            Graphics _g = Graphics.FromImage(_result);
            LinearGradientBrush _brush;

            _brush = new LinearGradientBrush(new Rectangle(0,0,width,1), c1, c2, LinearGradientMode.Horizontal);
            _g.FillRectangle(_brush, new Rectangle(0,0,width,1));

            _brush = new LinearGradientBrush(new Rectangle(0,height-1,width,1), c4, c3, LinearGradientMode.Horizontal);
            _g.FillRectangle(_brush, new Rectangle(0,height-1,width,1));

            for(int i=0; i < width; i++)
            {
                _brush = new LinearGradientBrush(new Rectangle(i,0,1,height-1), 
                                                _result.GetPixel(i,0), 
                                                _result.GetPixel(i,height-1), 
                                                LinearGradientMode.Vertical);

                _g.FillRectangle(_brush, new Rectangle(i,0,1,height-1));
            }

            return _result;
        }



вызывать что то типа


pictureBox1.Image = SoftFill(300, 300, Color.Yellow, Color.Blue, Color.Red, Color.Green);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.