Графическая библиотека
От: alex_mah Россия www.elsy.ru
Дата: 18.04.18 17:41
Оценка:
Коллеги, посоветуйте неспециалисту.

Нужна графическая библиотека для выполнения вот какой задачи:
Есть картинка, jpeg или png
На картинке есть замкнутые регионы неправильной формы, очерченные контуром контрастного цвета.
1) Нужно уметь определять клик внутри такого региона. Нужные активные регионы задаются точкой внутри него.
2) Нужно уметь быстро залить внутренности этих замкнутых регионов нужным цветом при указании точки внутри них. Заливать на самом рисунке необязательно, можно просто получить координаты точек области заливки и закрасить эту область на экране в отдельном слое, не меняя исходную картику.
Желательно, что бы это всё можно было масштабировать.
Все действия на экране, сохранения результата не требуется.
Отредактировано 19.04.2018 6:30 alex_mah . Предыдущая версия .
Re: Грофическая библиотека
От: Gattaka Россия  
Дата: 18.04.18 17:48
Оценка: +1 :)
Орфогрофическая
Re[2]: Грофическая библиотека
От: alex_mah Россия www.elsy.ru
Дата: 18.04.18 20:00
Оценка:
Здравствуйте, Gattaka, Вы писали:

G>Орфогрофическая


Дизлексическая, на старость лет.
Бывает такого напишу, волосы дыбом. Хорошо если первая и последняя буквы в слове те, что нужно
Re[3]: Грофическая библиотека
От: Gattaka Россия  
Дата: 18.04.18 21:50
Оценка:
Срамота... Проси админов поправить, тут люди добрые — помогут в сложной ситуации.
Re: Графическая библиотека
От: Neco  
Дата: 23.04.18 19:21
Оценка: 2 (1)
Здравствуйте, alex_mah, Вы писали:

_>1) Нужно уметь определять клик внутри такого региона. Нужные активные регионы задаются точкой внутри него.

_>2) Нужно уметь быстро залить внутренности этих замкнутых регионов нужным цветом при указании точки внутри них.
определение клика и закраска это по сути один и тот же алгоритм — зачем тут целая библиотека?

        public static int FilloutWithColor(int x, int y, int color, DirectBitmap dbmp, Action<int, int> colorize) {
            int oldColor = dbmp.GetPixel(x, y);
            int filledpixels = 0;
            int bmp_w = dbmp.Width;
            int bmp_h = dbmp.Height;

            var stack = new Stack<int>();
            stack.Push(dbmp.GetIndex(x, y));

            while (stack.Count > 0) {
                var spoint = dbmp.GetPoint(stack.Pop());
                int sx = spoint.X;
                int sy = spoint.Y;

                int leftX = sx - 1;
                while (leftX > 0 && dbmp.GetPixel(leftX, sy) == oldColor) {
                    leftX--;
                }

                int curX = leftX + 1;
                while (curX < bmp_w && dbmp.GetPixel(curX, sy) == oldColor) {
                    dbmp.SetPixel(curX, sy, color);
                    if (colorize != null)
                        colorize(curX, sy);

                    filledpixels++;

                    int uy = sy - 1;
                    if (uy > 0 && dbmp.GetPixel(curX, uy) == oldColor) {
                        stack.Push(dbmp.GetIndex(curX, uy));
                    }
                    int by = sy + 1;
                    if (by < bmp_h && dbmp.GetPixel(curX, by) == oldColor) {
                        stack.Push(dbmp.GetIndex(curX, by));
                    }

                    curX++;
                }

            }

            return filledpixels;
        }
всю ночь не ем, весь день не сплю — устаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.