185 / 188 / 17
Регистрация: 26.11.2010
Сообщений: 511
1

Заливка - C#

04.05.2011, 20:28. Показов 3363. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Самоочевидным является вот такой код:
C#
1
2
3
4
5
6
7
8
9
10
        private static Bitmap Fill(Bitmap b,int x, int y)
        {
            var c = b.GetPixel(x, y);
            b.SetPixel(x, y, Color.Black);
            if (x > 1) if (b.GetPixel(x - 1, y) == c) b = Fill(b, x - 1, y);
            if (x > 1 && y > 1) if (b.GetPixel(x - 1, y - 1) == c) b = Fill(b, x - 1, y - 1);
            if (x < b.Width) if (b.GetPixel(x + 1, y) == c) b = Fill(b, x + 1, y);
            if (x < b.Width - 1 && y < b.Height - 1) if (b.GetPixel(x + 1, y + 1) == c) b = Fill(b, x + 1, y + 1);
            return b;
        }
Но мы вываливаемся в StackOverflow при слишком большой глубине рекурсии. Как можно несильно подправить данный код, чтобы StackOverflow не вываливался? Если никак, можете кинуть других способов заливки без опасного кода?)

Добавлено через 16 минут
Сам спросил - сам ответил.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        public static void FloodFill(Bitmap bitmap, int x, int y, Color color)
        {
            BitmapData data = bitmap.LockBits(
                new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            var bits = new int[data.Stride / 4 * data.Height];
            Marshal.Copy(data.Scan0, bits, 0, bits.Length);
 
            var check = new LinkedList<Point>();
            int floodTo = color.ToArgb();
            int floodFrom = bits[x + y * data.Stride / 4];
            bits[x + y * data.Stride / 4] = floodTo;
 
            if (floodFrom != floodTo)
            {
                check.AddLast(new Point(x, y));
                while (check.Count > 0)
                {
                    Point cur = check.First.Value;
                    check.RemoveFirst();
 
                    foreach (Point off in new[] {
                new Point(0, -1), new Point(0, 1), 
                new Point(-1, 0), new Point(1, 0)})
                    {
                        var next = new Point(cur.X + off.X, cur.Y + off.Y);
                        if (next.X < 0 || next.Y < 0 || next.X >= data.Width || next.Y >= data.Height) continue;
                        if (bits[next.X + next.Y*data.Stride/4] != floodFrom) continue;
                        check.AddLast(next);
                        bits[next.X + next.Y * data.Stride / 4] = floodTo;
                    }
                }
            }
 
            Marshal.Copy(bits, 0, data.Scan0, bits.Length);
            bitmap.UnlockBits(data);
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2011, 20:28
Ответы с готовыми решениями:

Заливка многоугольника
Написать программу на С# которая обеспечивает алгоритм заливки многоугольника построчно. Левой...

Заливка многоугольника. C#
Написать программу на С# которая обеспечивает алгоритм заливки многоугольника построчно. Левой...

Заливка изображения
Сам сделал так: if (Param == 5)//сплошная заливка { if (e.Button...

Заливка по контуру
Подскажите варианты реализации заливки по клику мышки( чтоб так как в пейнте можно было кликнуть...

0
04.05.2011, 20:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2011, 20:28
Помогаю со студенческими работами здесь

Заливка области
У меня на форме рисуется прямоугольник мышью. Так вот хотелось бы узнать как сделать, чтобы во...

Заливка на radikal.ru
Покажите плиз как сделать...

Заливка объекта
Как залить объект косой линией?:wall:

Заливка ячейки в excel
Ребята помогите пожалуйста разобраться, пытаюсь залить ячейку в excel, но не знаю как. Значения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru