-(UIColor *) colorAtPixel :( CGPoint) point {
// Cancel if point is outside image coordinates
If (! CGRectContainsPoint (CGRectMake (0.0f, 0.0f, self. size. width, self. size. height), point )){
Return nil;
}
NSInteger pointX = trunc (point. x );
NSInteger pointY = trunc (point. y );
CGImageRef cgImage = self. CGImage;
NSUInteger width = self. size. width;
NSUInteger height = self. size. height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB ();
Int bytesPerPixel = 4;
Int bytesPerRow = bytesPerPixel * 1;
NSUInteger bitsPerComponent = 8;
Unsigned char pixelData [4] = {0, 0, 0 };
CGContextRef context = CGBitmapContextCreate (pixelData,
1,
1,
BitsPerComponent,
BytesPerRow,
ColorSpace,
KCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );
Cgcolorspacerelstrap (colorSpace );
CGContextSetBlendMode (context, kCGBlendModeCopy );
// Draw the pixel we are interested in onto the bitmap context
CGContextTranslateCTM (context,-pointX, pointY-(CGFloat) height );
CGContextDrawImage (context, CGRectMake (0.0f, 0.0f, (CGFloat) width, (CGFloat) height), cgImage );
CGContextRelease (context );
// Convert color values [0 .. 255] to floats [0. 0 .. 1.0]
CGFloat red = (CGFloat) pixelData [0]/255.0f;
CGFloat green = (CGFloat) pixelData [1]/255.0f;
CGFloat blue = (CGFloat) pixelData [2]/255.0f;
CGFloat alpha = (CGFloat) pixelData [3]/255.0f;
Return [uicolorwithred: red green: greenblue: blue alpha: alpha];
}
UIImage+ColorAtPixel.h #import
/* A category on UIImage that enables you to query the color value of arbitrary pixels of the image. */@interface UIImage (ColorAtPixel)- (UIColor *)colorAtPixel:(CGPoint)point;@end#import
#import "UIImage+ColorAtPixel.h"@implementation UIImage (ColorAtPixel)- (UIColor *)colorAtPixel:(CGPoint)point { // Cancel if point is outside image coordinates if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) { return nil; } NSInteger pointX = trunc(point.x); NSInteger pointY = trunc(point.y); CGImageRef cgImage = self.CGImage; NSUInteger width = self.size.width; NSUInteger height = self.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * 1; NSUInteger bitsPerComponent = 8; unsigned char pixelData[4] = { 0, 0, 0, 0 }; CGContextRef context = CGBitmapContextCreate(pixelData, 1, 1, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); CGContextSetBlendMode(context, kCGBlendModeCopy); // Draw the pixel we are interested in onto the bitmap context CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height); CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage); CGContextRelease(context); // Convert color values [0..255] to floats [0.0..1.0] CGFloat red = (CGFloat)pixelData[0] / 255.0f; CGFloat green = (CGFloat)pixelData[1] / 255.0f; CGFloat blue = (CGFloat)pixelData[2] / 255.0f; CGFloat alpha = (CGFloat)pixelData[3] / 255.0f; return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];}@end