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

本文介绍如何在iOS应用中从图片指定位置提取颜色值,并提供了判断颜色亮度及颜色值是否相同的实用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值