2012-09-15 3 views
2

Я реализовал рекурсивную функцию на изображении, которые вызывают ее соседние пиксели до тех пор, пока условия не будут завершены, я смог успешно выполнить этот код до разрешения изображения 200 × 200, но когда размер изображения увеличивается, будет сбой с ошибкой EXC_BAD_ACCESS в следующей строке стека ___ lldb_unnamed_function782 $$ libicucore.A.dylib. Я проверил мой код и не смог обнаружить какую-либо ошибку, возможно, из-за слишком многих рекурсивных функций обратного вызова. Если у кого-нибудь есть идеи, пожалуйста, дайте мне знать.получил ошибку EXC_BAD_ACCESS при выполнении с большим разрешением изображения

Это мой рекурсивный код:

-(void)magicImageContext:(unsigned char*)data point:(CGPoint)point red:(unsigned char)red green:(unsigned char)green blue:(unsigned char)blue bytesPerPixel:(NSInteger)bytesPerPixel bytesPerRow:(NSInteger)bytesPerRow size:(long long int)size width:(NSInteger)width height:(NSInteger)height maskedData:(unsigned char*)masked_data{ 
for(int x = point.x-1; x<=point.x+1; x++){ 
    for(int y = point.y-1; y<=point.y+1; y++){ 
     if((x == point.x) && (y == point.y)) { 
     } 
     else if((x<0) || (y<0) || (x>=width) || (y>=height)){ 
     } 
     else if([self checkPixelMarkedAtPoint:CGPointMake(x, y) data:masked_data]){ 
      int byteIndex = (bytesPerRow * y) + x* bytesPerPixel; 
      CGFloat red2 = (data[byteIndex]); 
      CGFloat green2 = (data[byteIndex + 1]); 
      CGFloat blue2 = (data[byteIndex + 2]); 
      if([self checkColorThresholdWithRed1:red green1:green blue1:blue red2:red2 green2:green2 blue2:blue2]){ 
       NSLog(@"x= %d, y= %d %d",x,y,byteIndex); 
       //mark pixels on masked image 
       [self changemaskedData:CGPointMake(x,y) data:masked_data]; 
       [self magicImageContext:data point:CGPointMake(x, y) red:red green:green blue:blue bytesPerPixel:bytesPerPixel bytesPerRow:bytesPerRow size:size width:width height:height maskedData:masked_data];    } 
     } 
    } 
} 
} 
+0

Если вы решили проблему, можете ли вы вставить код, который сделал трюк? – Levi

ответ

3

Если вы используете рекурсию по всем пикселям изображений, а затем ввод большого изображения, безусловно, приведет к переполнению стека.

Рассмотрите возможность перезаписи вашей функции для использования явного стека и цикла, чтобы избежать рекурсии. Это также может улучшить производительность вашего приложения, поскольку оно позволяет избежать относительно дорогостоящих вызовов функций.

Смежные вопросы