2013-03-26 12 views
8

द्वारा UIImage पिक्सेल की जांच करना मैं एक ऐसा ऐप्लिकेशन बना रहा हूं जिसमें मैं वर्तमान स्पर्श बिंदु का रंग प्राप्त करने की कोशिश कर रहा हूं, यदि यह बिंदु काला नहीं है तो यह एक पुनरावृत्ति/रिकर्सन चलाएगा और सभी गैर काले बिंदुओं को स्टोर करेगा सरणी। मैं पुनरावृत्ति के लिए इस समारोह का उपयोग कर रहा:पिक्सेल

-(void)function:(CGFloat)positiveX:(CGFloat)positiveY:(CGFloat)negativeX:(CGFloat)negativeY 
{ 
    if (canDoPositiveX == YES) 
    { 
     //Checking in positive 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(positiveX, positiveY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX+1 :positiveY :negativeX :negativeY]; 
     } 
     else 
     { 
      canDoPositiveX = NO; 
     } 
    } 

    if (canDoPositiveY == YES) 
    { 
     //Checking in positive 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 0"]) 
     { 
      CGPoint point = CGPointMake(positiveX, positiveY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY+1 :negativeX :negativeY]; 
     } 
     else 
     { 
      canDoPositiveY = NO; 
     } 
    } 

    if (canDoNegativeX == YES) 
    { 
     //Checking in negative 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(negativeX, negativeY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(negativeX, negativeY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY :negativeX-1 :negativeY]; 
     } 
     else 
     { 
      canDoNegativeX = NO; 
     } 
    } 

    if (canDoNegativeY == YES) 
    { 
     //Checking in negative   
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(negativeX, negativeY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      negativeY -= 1; 
      CGPoint point = CGPointMake(negativeX, negativeY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY :negativeX :negativeY-1]; 
     } 
     else 
     { 
      canDoNegativeY = NO; 
     } 
    } 

    NSLog(@"%u",[array count]); 

} 

अब, मैं उन बिंदुओं जो सरणी में हैं का रंग बदलने कर रहा हूँ, लेकिन यह केवल रंग अंक की सीधी रेखा, नहीं हर पिक्सेल। किसी भी मदद की वास्तव में सराहना की जाएगी। धन्यवाद!

+0

है कि एक विधि के लिए सही सिंटैक्स? मेरे लिए सही प्रतीत नहीं होता है। आपने अपना फ़ंक्शन "फ़ंक्शन" कहा है? बहुत स्पष्ट नहीं है। क्या कर सकते हैं DNNegativeY और CanDoNegativeX? – Odrakir

+0

वे सिर्फ चेक (बूलियन) हैं। इसके अलावा, मुझे इस प्रकार के एफ रिकर्सन के बारे में कोई जानकारी नहीं है: पी। यदि आप जानते हैं कि इसे कैसे अच्छी तरह से करना है, तो कृपया मुझे बताएं। @ ओडाकिर मैं आपको इसके लिए 100 रुपये का इनाम दे सकता हूं। –

+1

मुझे पता है कि वे बूलियन हैं, लेकिन मुझे डर है कि अगर मैं समझ नहीं पा रहा हूं कि आपका कोड क्या करता है तो मैं आपकी मदद नहीं कर सकता। उन बूलियन का क्या अर्थ है? – Odrakir

उत्तर

2

इसे आजमाएं। मैं वास्तव में इसका परीक्षण नहीं कर सकता लेकिन इसे काम करना चाहिए।

-(void)function:(CGFloat)positiveX:(CGFloat)positiveY:(CGFloat)negativeX:(CGFloat)negativeY 
{ 
    // Check your current point 
    if ([[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
    { 
     // reached the dead end (break recursion) 
     return; 
    } 

    CGPoint point = CGPointMake(positiveX, positiveY); 
    [array addObject:[NSValue valueWithCGPoint:point]]; 

    BOOL canDoPositiveX = ![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX+1, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]; 
    BOOL canDoPositiveY = ![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY+1)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]; 
    BOOL canDoNegativeX = ![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX-1, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]; 
    BOOL canDoNegativeY = ![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY-1)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]; 

    if (canDoPositiveX == YES) 
    { 
     [self function:positiveX+1 :positiveY :negativeX :negativeY]; 
    } 

    if (canDoPositiveY == YES) 
    { 
     [self function:positiveX :positiveY+1 :negativeX :negativeY]; 
    } 

    if (canDoNegativeX == YES) 
    { 
     [self function:positiveX :positiveY :negativeX-1 :negativeY]; 
    } 

    if (canDoNegativeY == YES) 
    { 
     [self function:positiveX :positiveY :negativeX :negativeY-1]; 
    } 

    NSLog(@"%u",[array count]); 
} 

इसके अलावा इन चर अपनी कक्षा canDoPositiveX, canDoPositiveY, canDoNegativeX से, canDoNegativeY इस सवाल को दूर

+0

आपकी सहायता के लिए धन्यवाद। मुझे लगता है कि आपको वह नहीं मिला जो मैं करना चाहता हूं। लेमे इसे पहले साफ़ करें। मेरे पास UIImage है, जब उपयोगकर्ता UIImage के गैर-काले हिस्से पर टैप करता है, तो इसे यूआईएममेज के सभी गैर-काले बिंदुओं को फिर से सक्रिय और सहेजना चाहिए और पुनरावृत्ति को काले बिंदु को बंद करना चाहिए। लेकिन यह कोड आपने मुझे दिया है काम नहीं कर रहा है। –

2

की जांच:

How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?

आप आसानी से उपयोग करने के लिए सक्षम होना चाहिए/पर कोड को संशोधित दिए गए UIImage के लिए केवल काले (या लगभग काला) पिक्सेल निर्देशांक को वापस करने का स्वीकार्य उत्तर।

2

इस संशोधित कोड के साथ प्रयास करें:

-(void)function:(CGFloat)positiveX:(CGFloat)positiveY:(CGFloat)negativeX:(CGFloat)negativeY 
{ 
    if (canDoPositiveX == YES) 
    { 
     //Checking in positive 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(positiveX, positiveY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX+1 :positiveY :negativeX :negativeY]; 
     } 
     else 
     { 
      canDoPositiveX = NO; 
      canDoPositiveY = YES; 
      canDoNegativeX = YES; 
      canDoNegativeY = YES; 
     } 
    } 

    if (canDoPositiveY == YES) 
    { 
     //Checking in positive 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 0"]) 
     { 
      CGPoint point = CGPointMake(positiveX, positiveY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY+1 :negativeX :negativeY]; 
     } 
     else 
     { 
      canDoPositiveX = YES; 
      canDoPositiveY = NO; 
      canDoNegativeX = YES; 
      canDoNegativeY = YES; 
     } 
    } 

    if (canDoNegativeX == YES) 
    { 
     //Checking in negative 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(negativeX, negativeY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(negativeX, negativeY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY :negativeX-1 :negativeY]; 
     } 
     else 
     { 
      canDoPositiveX = YES; 
      canDoPositiveY = YES; 
      canDoNegativeX = NO; 
      canDoNegativeY = YES; 
     } 
    } 

    if (canDoNegativeY == YES) 
    { 
     //Checking in negative   
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(negativeX, negativeY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(negativeX, negativeY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY :negativeX :negativeY-1]; 
     } 
     else 
     { 
      canDoPositiveX = YES; 
      canDoPositiveY = YES; 
      canDoNegativeX = YES; 
      canDoNegativeY = NO; 
     } 
    } 

    NSLog(@"%u",[array count]); 
} 
+0

हाय, आपके उत्तर के लिए धन्यवाद। मैंने पहले ही इस कोड को आजमाया है। लेकिन इस कोड में समस्या यह है कि यह स्टैक ओवरफ़्लो का कारण बनता है, जैसे कि जब मैंने इस फ़ंक्शन को कॉल करने का प्रयास किया, तो मेरा एप्लिकेशन रुक गया और फिर अचानक क्रैश हो गया :( –

संबंधित मुद्दे