2011-11-14 15 views
6

私はIPhoneペイントアプリをやっています。 toucheventを使って画像の特定の部分をペイントして、ピクセルデータを見つけ、そのピクセルデータを使用して画像の残りの部分をペイントしたいと思います。タッチイベントを使用して、私は一部のピクセル値を得た:画像の一部を色で塗りつぶす

- (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; 
} 

私はデータを取得していますtolerence値を使用します。ここで私は残りのセクションをペイントするのに苦労しています。

- (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

まず、ビットマップイメージをNSArrayUIColorオブジェクトに変換することは不可能です。方法、あまりにも多くのオーバーヘッド。代わりにピクセルバッファで作業してください。ポインタの使い方を学んでください。

http://en.wikipedia.org/wiki/Flood_fill#The_algorithmは、再帰またはキューのいずれかを使用して、フラッドフィルを実行するための簡単な手法の概要を示します。

+0

私はまた、多くのステップを試してみましたが、アプリの例はそこにあります。ちょうど、 – Marios

+1

です。これはちょうど洪水の詰め物です。そのwikipediaが必要です;これは前に見ました – Marios

+0

@aruniosこの問題は解決しましたか? –

関連する問題