用颜色填充图像的一部分
我正在做一个iPhone的绘画应用程序。 我想用touchevent绘制图像的特定部分来查找像素数据,然后使用该像素数据来绘制图像的其余部分。 使用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; }
使用容差值我得到的数据。 在这里,我正在努力画剩下的部分。
- (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; }
任何build议,使这项工作,请?
首先,将位图图像转换成UIColor
对象的NSArray
是坚果。 方式,太多的开销。 改用pixelbuffer。 学习如何使用指针。
http://en.wikipedia.org/wiki/Flood_fill#The_algorithm提供了一些使用recursion或队列执行洪泛填充的简单技术的好概述。