Коллеги, посоветуйте неспециалисту.
Нужна графическая библиотека для выполнения вот какой задачи:
Есть картинка, jpeg или png
На картинке есть замкнутые регионы неправильной формы, очерченные контуром контрастного цвета.
1) Нужно уметь определять клик внутри такого региона. Нужные активные регионы задаются точкой внутри него.
2) Нужно уметь быстро залить внутренности этих замкнутых регионов нужным цветом при указании точки внутри них. Заливать на самом рисунке необязательно, можно просто получить координаты точек области заливки и закрасить эту область на экране в отдельном слое, не меняя исходную картику.
Желательно, что бы это всё можно было масштабировать.
Все действия на экране, сохранения результата не требуется.
Срамота... Проси админов поправить, тут люди добрые — помогут в сложной ситуации.
Здравствуйте, 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;
}