ios 图片像素点取颜色,判断颜色是否为亮色,颜色对比

来源:互联网 发布:如何设置淘宝分流 编辑:程序博客网 时间:2024/05/17 02:18

做项目的时候遇到一个问题,在图片的某一点取其颜色值然后根据该颜色值是否为亮色使控件显示为不同的状态、颜色。
下面是怎么在图片中取到颜色值

+ (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颜色即

0 0