2011-11-14 14 views
6

के साथ एक छवि का एक हिस्सा भरना मैं एक आईफोन पेंटिंग ऐप कर रहा हूं। मैं पिक्सेल डेटा खोजने के लिए टचचेवेंट का उपयोग करके एक छवि का एक विशेष भाग पेंट करना चाहता हूं और फिर छवि के शेष हिस्से को पेंट करने के लिए उस पिक्सेल डेटा का उपयोग करना चाहता हूं।रंग

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    startPoint = [[touches anyObject] locationInView:imageView]; 

    NSLog(@"the value of the index is %i",index); 

    NSString* imageName=[NSString stringWithFormat:@"roof%i", index]; 

    tempColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:imageName]]; 
    lastPoint = [touch locationInView:self.view]; 
    lastPoint.y -= 20; 
    NSString *tx = [[NSString alloc]initWithFormat:@"%.0f", lastPoint.x]; 
    NSString *ty = [[NSString alloc]initWithFormat:@"%.0f", lastPoint.y]; 

    NSLog(@"the vale of the string is %@ and %@",tx,ty); 

    int ix=[tx intValue]; 
    int iy=[ty intValue]; 
    int z=1; 

    NSLog(@"the vale of the string is %i and %i and z is %i",ix,iy,z); 

    [self getRGBAsFromImage:newImage atX:ix andY:iy count1:1]; 
} 

यहाँ मैं छवि के लिए पिक्सेल डेटा हो रही है::

-(void)getRGBAsFromImage:(UIImage*)image atX:(int)xx andY:(int)yy count1:(int)count 
{ 
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:count]; 

    // First get the image into your data buffer 
    CGImageRef imageRef = [image CGImage]; 
    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    unsigned char *rawData = malloc(height * width * 4); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
               bitsPerComponent, bytesPerRow, colorSpace, 
               kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
    CGContextRelease(context); 

    // Now your rawData contains the image data in the RGBA8888 pixel format. 
    int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel; 
    for (int ii = 0 ; ii < count ; ++ii) 
    { 
     CGFloat red = (rawData[byteIndex]  * 1.0)/255.0; 
     CGFloat green = (rawData[byteIndex + 1] * 1.0)/255.0; 
     CGFloat blue = (rawData[byteIndex + 2] * 1.0)/255.0; 
     CGFloat alpha = (rawData[byteIndex + 3] * 1.0)/255.0; 
     byteIndex += 4; 
     NSLog(@"the vale of the rbg of red is %f",red); 

     UIColor *acolor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
     [result addObject:acolor]; 
    } 

    free(rawData); 
    return result; 
} 

एक सहनशीलता मूल्य मैं डेटा हो रही है का उपयोग करते हुए touchevent का उपयोग करना, मैं भाग के लिए पिक्सेल मूल्य मिला है। यहां मैं शेष खंड को पेंट करने के लिए संघर्ष कर रहा हूं।

- (BOOL)cgHitTestForArea:(CGRect)area { 
    BOOL hit = FALSE; 

    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 

    float areaFloat = ((area.size.width * 4) * area.size.height); 
    unsigned char *bitmapData = malloc(areaFloat);  

    CGContextRef context = CGBitmapContextCreate(bitmapData, 
               area.size.width, 
               area.size.height, 
               8, 
               4*area.size.width, 
               colorspace, 
               kCGImageAlphaPremultipliedLast); 
    CGContextTranslateCTM(context, -area.origin.x, -area.origin.y); 
    [self.layer renderInContext:context]; 

    //Seek through all pixels.  
    float transparentPixels = 0; 
    for (int i = 0; i < (int)areaFloat ; i += 4) { 
     //Count each transparent pixel. 
     if (((bitmapData[i + 3] * 1.0)/255.0) == 0) { 
      transparentPixels += 1; 
     } 
    } 
    free(bitmapData); 

    //Calculate the percentage of transparent pixels. 
    float hitTolerance = [[self.layer valueForKey:@"hitTolerance"]floatValue]; 

    NSLog(@"Apixels: %f hitPercent: %f",transparentPixels,(transparentPixels/areaFloat)); 

    if ((transparentPixels/(areaFloat/4)) < hitTolerance) { 
     hit = TRUE; 
    }  

    CGColorSpaceRelease(colorspace); 
    CGContextRelease(context); 

    return hit;  
} 

इस काम को करने के लिए कोई सुझाव कृपया?

उत्तर

1

सबसे पहले, वस्तुओं के NSArray में बिटमैप छवि को बदलना नट्स है। रास्ता, रास्ता बहुत अधिक ओवरहेड। इसके बजाय एक पिक्सेलबफर के साथ काम करें। पॉइंटर्स का उपयोग कैसे करें सीखें।

http://en.wikipedia.org/wiki/Flood_fill#The_algorithm या तो रिकर्सन या कतारों का उपयोग करके बाढ़ भरने के लिए कुछ सरल तकनीकों का एक अच्छा अवलोकन प्रदान करता है।

+0

मैं भी देखा है कि मैं कई कदम tryed किसी भी अनुप्रयोग उदाहरण नहीं है, सिर्फ बताओ, – Marios

+1

यह सिर्फ एक बाढ़ भरण है, उदाहरण के अपने एक विकिपीडिया मैं की जरूरत है; – Marios

+0

@arunios से पहले इस देखा आप इस समस्या का समाधान है? –

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