Что делать елси не хватает стэка?
Кто знает подскажите как быть в таком случае???
Спасибо!
Не лучше ли, для начала, оптимизировать свой алгоритм - если если для относительно несложной задачи вам не хватает размера стека в один мегабайт - то наверное в "консерватории надо чтото подправить"?
Кроме того - если черные пикснли расположены разрежено на большой области - ошибка возникает тоже?
Тут есть пример.
Кстати даже если проверка выполняется с середины изображения и пиксели проверяются последовательно - то восемь проверок надо делать только один раз - на первом. Если же поиск пикселей начинается с края картинки - то восемь проверок не может быть никак. Наверняка один и тот же пиксель попадает в массив многократно.
Хз. Приведи описание алгоритма или хотябы код своей функции - потому что иначе разговор будет в пустую я например не телепат - могу предполагать что алгоритм работы твоей функции приводит в конечном счете к разбалансировке стека - но как и почему хз. Или если хочешь - вон пользуйся утилитой которую тебе предложили специалисты.
{
Point point = new Point(x, y);
if (!ColorRegion.Contains(point))
{
if (bitmap.GetPixel(x, y).ToArgb() == Color.Black.ToArgb())
{
ColorRegion.Add(point);
if (x - 1 >= 0 & y - 1 >= 0) this.checkPixel(x - 1, y - 1);//верхний левый угол
if (y - 1 >= 0) checkPixel(x, y - 1);
if (x + 1< bitmap.Width & y - 1 >= 0) checkPixel(x + 1, y - 1);//верхний правый угол
if (x + 1 < bitmap.Width) checkPixel(x + 1, y);
if (x + 1 < bitmap.Width & y + 1 < bitmap.Height) checkPixel(x + 1, y + 1);//нижний правый угол
if (y + 1 < bitmap.Height) checkPixel(x , y + 1);
if (x - 1 >= 0 & y + 1 < bitmap.Height) checkPixel(x - 1, y + 1);//нужний левый угол
if (x - 1 >= 0) checkPixel(x-1, y);
}
}
}
{
Point point = new Point(x, y);
if (!ColorRegion.Contains(point))
{
if (bitmap.GetPixel(x, y).ToArgb() == Color.Black.ToArgb())
{
ColorRegion.Add(point);
if (x - 1 >= 0 & y - 1 >= 0) this.checkPixel(x - 1, y - 1);//верхний левый угол
if (y - 1 >= 0) checkPixel(x, y - 1);
if (x + 1< bitmap.Width & y - 1 >= 0) checkPixel(x + 1, y - 1);//верхний правый угол
if (x + 1 < bitmap.Width) checkPixel(x + 1, y);
if (x + 1 < bitmap.Width & y + 1 < bitmap.Height) checkPixel(x + 1, y + 1);//нижний правый угол
if (y + 1 < bitmap.Height) checkPixel(x , y + 1);
if (x - 1 >= 0 & y + 1 < bitmap.Height) checkPixel(x - 1, y + 1);//нужний левый угол
if (x - 1 >= 0) checkPixel(x-1, y);
}
}
}
Ой как все запущено.
Почему вы не используете посточное сканирование? Зачем все эти сложности? Ваша ошибка заключается в том что вы создаете неконтролируемую рекурсию - и естественно вы получаете переполнение стека. Вызвав в первый раз функцию и выделив память под point вы не освободите ее до тех пор, пока все пиксели не будут обработаны (или размер стека исчерпан - что у вас собственно и происходит) - это особенность рекурсивной функции.
Почему не сделать это так:
if (bitmap.GetPixel(x, y).ToArgb() == Color.Black.ToArgb()) {
//Тут разбирайтесь сами надо вам указатель или нет
Point point(x, y);
ColorRegion.Add(&point);
}
}
void scanPixel(){
for(int y =0;y < bitmap.Height;y++){
for(int x=0;x < bitmap.Width;x++)
checkPixel(x, y);
}
}
или если вам так уж важна рекурсия:
if (bitmap.GetPixel(x, y).ToArgb() == Color.Black.ToArgb()) {
//Тут разбирайтесь сами надо вам указатель или нет
Point point(x, y);
ColorRegion.Add(&point);
}
if(x < bitmap.Width)
checkPixel(x+1,y);
else if(y < bitmap.Height){
x =0;
checkPixel(x,y+1);
}
return;
}
Код не тестировался так что со всеми возможными ошибками разбирайтесь сами.
З.Ы. Используйте средства форматирования кода - небрежное оформление сообщений, признак неуважения к тем, кто вашу кашу читает.
В твоих примерах и вижу перебор всех пикселей на черный цвет!
Но дело в том что мне надо выделить черную область(произвольной формы) и именно по этому я проверяю все соседние пиксели!!!!
Если есть другие алгоритмы получения множества пикселей представляющих область опр. цвета то ПОЖАЛУЙСТА ПРЕДЛОЖИТЕ!
Вспомните японские рисунки - в газетах иногда печатают такие головоломки - там нужно черные полоски закрашивать.
В данном случае выбран тот же принцип. Для каждой строки изображения происходит поиск последовательности пикселей одного цвета, в результирующий список записывается сначала точка начала а потом и точка конца последовательности.
List<Point> buffer = new List<Point>();
int width = bmp.Width;
int height = bmp.Height;
bool into_figure = false;
Point next_point = new Point(0, 0);
Point prev_point = new Point(0, 0);
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
prev_point = next_point;
next_point = new Point(x, y);
int cur_color = bmp.GetPixel(x, y).ToArgb();
if (cur_color == color) {
if (!into_figure) {
buffer.Add(next_point); // начало последовательности
into_figure = true;
}
} else {
if (into_figure) {
buffer.Add(prev_point); // конец последовательности
into_figure = false;
}
}
}
if (into_figure) {
buffer.Add(next_point); // устанавливаем конец последовательности
// так как она дошла до края картинки
into_figure = false;
}
}
return buffer;
}
using (Bitmap bmp = Bitmap.FromFile("sample.bmp") as Bitmap) { // загружаем тестовую картинку
Bitmap result = new Bitmap(bmp.Width, bmp.Height); //в этот битмап будем рисовать
using (Graphics gfx = Graphics.FromImage(result))
using (Pen pen = new Pen(color)) { // да-да карандашик нада создавать =)
List<Point> points = Extract(bmp, color.ToArgb()); // обрабатываем входное изображение
for (int i = 0; i < points.Count; i += 2) {
Point first = points;
Point last = points[i + 1];
gfx.DrawLine(pen, first, last);
}
}
pictureBox1.Image = result;
}
В твоих примерах и вижу перебор всех пикселей на черный цвет!
Но дело в том что мне надо выделить черную область(произвольной формы) и именно по этому я проверяю все соседние пиксели!!!!
Если есть другие алгоритмы получения множества пикселей представляющих область опр. цвета то ПОЖАЛУЙСТА ПРЕДЛОЖИТЕ!
Во первых не кричите. Алгоритм который вам нужен - называется "алгоритм пьяницы" - гуглите и обрящите.
З.Ы. И советую медетировать на мою подпись - потому как хамов - орущих и требующих на на дух не перевариваю. Еще один подобный эксцесс забаню нафиг. Тема закрыта.
Как же закрыта если я дописываю :)
Автору. Рекурсия - зло. Ничто не мешает вам избавится от рекурсии и сделать тоже самое цыклом. И стек жрать не надо и памяти меньше уйдет.
Автору. Рекурсия - зло. Ничто не мешает вам избавится от рекурсии и сделать тоже самое цыклом. И стек жрать не надо и памяти меньше уйдет.
:) забыл галку поставить. теперь закрыта.