Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get Pixel color of UIImage

How can I get the RGB value of a particular pixel in a UIImage?

like image 883
Matt S. Avatar asked Jul 19 '10 19:07

Matt S.


2 Answers

OnTouch

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {     UITouch *touch = [[touches allObjects] objectAtIndex:0];     CGPoint point1 = [touch locationInView:self.view];     touch = [[event allTouches] anyObject];      if ([touch view] == imgZoneWheel)     {         CGPoint location = [touch locationInView:imgZoneWheel];         [self getPixelColorAtLocation:location];         if(alpha==255)         {             NSLog(@"In Image Touch view alpha %d",alpha);             [self translateCurrentTouchPoint:point1.x :point1.y];             [imgZoneWheel setImage:[UIImage imageNamed:[NSString stringWithFormat:@"blue%d.png",GrndFild]]];         }     } }    - (UIColor*) getPixelColorAtLocation:(CGPoint)point  {      UIColor* color = nil;      CGImageRef inImage;      inImage = imgZoneWheel.image.CGImage;       // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue     CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];     if (cgctx == NULL) { return nil; /* error */ }      size_t w = CGImageGetWidth(inImage);     size_t h = CGImageGetHeight(inImage);     CGRect rect = {{0,0},{w,h}};       // Draw the image to the bitmap context. Once we draw, the memory      // allocated for the context for rendering will then contain the      // raw image data in the specified color space.     CGContextDrawImage(cgctx, rect, inImage);       // Now we can get a pointer to the image data associated with the bitmap     // context.     unsigned char* data = CGBitmapContextGetData (cgctx);     if (data != NULL) {         //offset locates the pixel in the data from x,y.          //4 for 4 bytes of data per pixel, w is width of one row of data.         int offset = 4*((w*round(point.y))+round(point.x));         alpha =  data[offset];          int red = data[offset+1];          int green = data[offset+2];          int blue = data[offset+3];          color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];     }      // When finished, release the context     //CGContextRelease(cgctx);      // Free image data memory for the context     if (data) { free(data); }      return color; }  - (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef)inImage  {     CGContextRef    context = NULL;     CGColorSpaceRef colorSpace;     void *          bitmapData;     int             bitmapByteCount;     int             bitmapBytesPerRow;      // Get image width, height. We'll use the entire image.     size_t pixelsWide = CGImageGetWidth(inImage);     size_t pixelsHigh = CGImageGetHeight(inImage);      // Declare the number of bytes per row. Each pixel in the bitmap in this     // example is represented by 4 bytes; 8 bits each of red, green, blue, and     // alpha.     bitmapBytesPerRow   = (pixelsWide * 4);     bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);      // Use the generic RGB color space.     colorSpace = CGColorSpaceCreateDeviceRGB();      if (colorSpace == NULL)     {         fprintf(stderr, "Error allocating color space\n");         return NULL;     }      // Allocate memory for image data. This is the destination in memory     // where any drawing to the bitmap context will be rendered.     bitmapData = malloc( bitmapByteCount );     if (bitmapData == NULL)      {         fprintf (stderr, "Memory not allocated!");         CGColorSpaceRelease( colorSpace );         return NULL;     }      // Create the bitmap context. We want pre-multiplied ARGB, 8-bits      // per component. Regardless of what the source image format is      // (CMYK, Grayscale, and so on) it will be converted over to the format     // specified here by CGBitmapContextCreate.     context = CGBitmapContextCreate (bitmapData,                                      pixelsWide,                                      pixelsHigh,                                      8,      // bits per component                                      bitmapBytesPerRow,                                      colorSpace,                                      kCGImageAlphaPremultipliedFirst);     if (context == NULL)     {         free (bitmapData);         fprintf (stderr, "Context not created!");     }      // Make sure and release colorspace before returning     CGColorSpaceRelease( colorSpace );      return context; } 
like image 35
Ashok Domadiya Avatar answered Sep 21 '22 13:09

Ashok Domadiya


Try this very simple code:

I used to detect a wall in my maze game (the only info that I need is the alpha channel, but I included the code to get the other colors for you):

- (BOOL)isWallPixel:(UIImage *)image xCoordinate:(int)x yCoordinate:(int)y {      CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));     const UInt8* data = CFDataGetBytePtr(pixelData);      int pixelInfo = ((image.size.width  * y) + x ) * 4; // The image is png      //UInt8 red = data[pixelInfo];         // If you need this info, enable it     //UInt8 green = data[(pixelInfo + 1)]; // If you need this info, enable it     //UInt8 blue = data[pixelInfo + 2];    // If you need this info, enable it     UInt8 alpha = data[pixelInfo + 3];     // I need only this info for my maze game     CFRelease(pixelData);      //UIColor* color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f]; // The pixel color info      if (alpha) return YES;     else return NO;  } 
like image 200
Minas Petterson Avatar answered Sep 17 '22 13:09

Minas Petterson