做项目的时候遇到一个问题,在图片的某一点取其颜色值然后根据该颜色值是否为亮色使控件显示为不同的状态、颜色。
下面是怎么在图片中取到颜色值
+ (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image {
UIColor* color = nil;
CGImageRef inImage = image.CGImage;
CGContextRef cgctx = [GetImageOnePointColor 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);
//
// NSLog(@"x:%f y:%f", point.x, point.y);
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 = (int)(pixelsWide * 4);
bitmapByteCount = (int)(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,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL)
{
free (bitmapData);
fprintf (stderr, "Context not created!");
}
CGColorSpaceRelease( colorSpace );
return context;
}
下面代码可以判断某一个颜色是否为亮色
//判断颜色是不是亮色
+ (BOOL) isLightColor:(UIColor*)color {
CGFloat components[3];
[UIColor getRGBComponents:components forColor:color];
// NSLog(@"%f %f %f", components[0], components[1], components[2]);
CGFloat num = components[0] + components[1] + components[2];
if(num < 382)
return NO;
else
return YES;
}
//获取RGB值
+ (void)getRGBComponents:(CGFloat [3])components forColor:(UIColor *)color {
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
#else
int bitmapInfo = kCGImageAlphaPremultipliedLast;
#endif
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char resultingPixel[4];
CGContextRef context = CGBitmapContextCreate(&resultingPixel,
1,
1,
8,
4,
rgbColorSpace,
bitmapInfo);
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
CGContextRelease(context);
CGColorSpaceRelease(rgbColorSpace);
for (int component = 0; component < 3; component++) {
components[component] = resultingPixel[component];
}
}
下面代码可以判断两个颜色值是否相同
enum {
enEqual,
enNotEaual,
enCannotConvert,
};
typedef NSInteger KCompareResult;
+ (KCompareResult) isTheSameColor:(UIColor*)color
redValue:(CGFloat)rValue
greenValue:(CGFloat)gValue
blueValue:(CGFloat)bValue
alphaValue:(CGFloat)aValue
{
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
CGFloat redValue, greenValue, blueValue, alphaValue;
if ([color getRed:&redValue green:&greenValue blue:&blueValue alpha:&alphaValue]) {
if (redValue == rValue && greenValue == gValue
&& blueValue == bValue && alphaValue == aValue) {
return enEqual;
}
else {
return enNotEaual;
}
}
else { // can not convert
return enCannotConvert;
}
}
}
但是这样写感觉有点儿繁琐于是我采用了ios5之后才有的一个方法CGColorEqualToColor(color1.CGColor, color2.CGColor)
UIColor *color1 = [GetImageOnePointColor getPixelColorAtLocation:CGPointMake(1.0, 1.0) inImage:image];
UIColor *color2 = [UIColor whiteColor];
- (BOOL) isTheSameColor2:(UIColor*)color1 anotherColor:(UIColor*)color2
{
if (CGColorEqualToColor(color1.CGColor, color2.CGColor))
{
return YES;
}
else
{
return NO;
}
}
但是无论我怎么试,取的颜色中分明有白色返回结果却始终为NO。
后来我把对比颜色白色,UIcolor改成RGB颜色即