Доброго времени суток, господа!
Суть вопроса состоит в следующем:
Я обрабатываю фото попиксельно:
Bitmap bit = new Bitmap(StartImage);
Size size = bit.Size;
for (int y = 0; y < size.Height; y++)
for (int x = 0; x < size.Width; x++)
{
Color c = bit.GetPixel(x, y);
... Некоторые действия с пикселем ...
}
Понадобилась возможность исключать из области обработки некоторые области. Ну, я подумал, что, мол, фигня вопрос: сейчас задам на вход массив точек, которые обрабатывать не нужно, а перед получением пикселя и его обработкой поставлю
if (ExceptPoints.Contains(new Point(x,y)))
и дело в шляпе! Но не тут-то было. Метод начал работать просто до чертиков медленно (а когда для тестирования я выбрал для исключения половину всего изображения, я не дождался результата и в течение 4 минут). Попробовал реализовать многопоточность для решения этой задачи. Но чуть не спалил себе ЦП (99% загрузки) хД
В общем, нужно как-то сие дело оптимизировать (или реализовать некорявую многопоточность), но в голову не идут идеи, как же это сделать.
Так что обращаюсь к вам за советом по сему нелегкому делу!
P.S. - исключаемые области изначально задаются кругами с рандомным радиусом. Но что проверять, входит ли точка в один из кругов, что проверять, есть ли она среди массива, содержащего все точки этих кругов, по времени выходит одно
Ответ
Есть два пути ускорения.
Во-первых, можно вместо линейной по количеству проверяемых точек проверке на вхождение в List
Во-вторых, для работы с изображениями лучше всего отказаться от очень медленного GetPixel/SetPixel. Вместо этого имеет смысл получить «сырые» данные, используя LockBits (в статье на MSDN есть хороший пример), и работать с ними.
Комментариев нет:
Отправить комментарий