I am wondering how I can scan an image on the iPhone and analyze the RGB value of each pixel, thus finally determining the average RGB for the whole image. If anyone could push me in the right direction it would be greatly appreciated. I am new to image analysis and not sure where to start, or if something like this is included in the iOS 5 APIs.
Asked
Active
Viewed 4,156 times
3 Answers
3
Just Paste it, i'm detecting the color on touch .
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
if (self.view.hidden==YES) {
//color wheel is hidden, so don't handle this as a color wheel event.
[[self nextResponder] touchesEnded:touches withEvent:event];
return;
}
UITouch* touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view]; //where image was tapped
UIColor * lastColor = [self getPixelColorAtLocation:point];
NSLog(@"color %@",lastColor);
UIImageView *lbl=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
lbl.layer.cornerRadius=50;
[imageView addSubview:lbl];
lbl.backgroundColor=lastColor;
lbl.center=CGPointMake(stillImageFilter.center.x*320, (stillImageFilter.center.y*320)-125);
NSLog(@"stillImageCenter = %f,%f",stillImageFilter.center.x,stillImageFilter.center.y);}
- (UIColor*) getPixelColorAtLocation:(CGPoint)point {
UIColor* color = nil;
CGImageRef inImage = imageView.image.CGImage;
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}};
CGContextDrawImage(cgctx, rect, inImage);
unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
int offset = 4*((w*round(point.y))+round(point.x));
int alpha = data[offset];
int red = data[offset+1];
int green = data[offset+2];
int blue = data[offset+3];
NSLog(@"offset: %i colors: RGB A %i %i %i %i",offset,red,green,blue,alpha);
color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];
}
CGContextRelease(cgctx);
if (data) { free(data); }
return color;
}
- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
size_t pixelsWide = CGImageGetWidth(inImage);
size_t pixelsHigh = CGImageGetHeight(inImage);
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
{
fprintf(stderr, "Error allocating color space\n");
return NULL;
}
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
fprintf (stderr, "Memory not allocated!");
CGColorSpaceRelease( colorSpace );
return NULL;
}
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL)
{
free (bitmapData);
fprintf (stderr, "Context not created!");
}
CGColorSpaceRelease( colorSpace );
return context;
}

Mohit Tomar
- 5,173
- 2
- 33
- 40
-
Because the code is using createARGBBitmapContextFromImage, you might want to take a look at http://stackoverflow.com/questions/28759902/potential-leak-of-object-stored-in-context/28761796#28761796 – GlennRay Nov 21 '15 at 02:08
0
Look at Camera Programming Topics for iOS - Taking Pictures and Movies this will get the image in your app.
After that look at something like: how-to-get-the-rgb-values-for-a-pixel-on-an-image-on-the-iphone
-
For your second link posted would all of that go into a IBAction function if I wanted it coded to the tap of a button? I'm understanding the code, just curious on how to implement it all. Thank you. – tguidon Feb 15 '12 at 17:57
0
Getting the CGImage from a UIImage can give you this data
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];
UInt8 green = data[(pixelInfo + 1)];
UInt8 blue = data[pixelInfo + 2];
UInt8 alpha = data[pixelInfo + 3];
CFRelease(pixelData);
More here: Getting pixel data from UIImageView -- works on simulator, not device
And Here: Get Pixel color of UIImage

Community
- 1
- 1

danielbeard
- 9,120
- 3
- 44
- 58
-
-
Would this scan the whole image since it is defining image.size.width? – tguidon Feb 15 '12 at 17:58