iOS代码获取图片主色调

来源:互联网 发布:医院预约挂号软件 编辑:程序博客网 时间:2024/05/18 20:49

最近的开发过程中,有一个功能是根据银行的图标来确定cell的背景颜色,即获取图片的主色调。网上搜索了一些方法,发现有位博主分享了一个很好的代码方法,不过效果感觉不是特别明显,或者说变化不是很大,如图:

后来仔细想了一下,代码和方法是没有错误的,但是我们把透明颜色以及白色也计算进去了,所以效果才会那么不明显。所以在进行rgb色值获取的时候,排除掉透明色及白色即可,修改后的代码如下:

//根据图片获取图片的主色调+(UIColor*)mostColor:(UIImage*)image{    #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1    int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;#else    int bitmapInfo = kCGImageAlphaPremultipliedLast;#endif    //第一步 先把图片缩小 加快计算速度. 但越小结果误差可能越大    CGSize thumbSize=CGSizeMake(image.size.width/2, image.size.height/2);        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();    CGContextRef context = CGBitmapContextCreate(NULL,                                                 thumbSize.width,                                                 thumbSize.height,                                                 8,//bits per component                                                 thumbSize.width*4,                                                 colorSpace,                                                 bitmapInfo);        CGRect drawRect = CGRectMake(0, 0, thumbSize.width, thumbSize.height);    CGContextDrawImage(context, drawRect, image.CGImage);    CGColorSpaceRelease(colorSpace);    //第二步 取每个点的像素值    unsigned char* data = CGBitmapContextGetData (context);    if (data == NULL) return nil;    NSCountedSet *cls=[NSCountedSet setWithCapacity:thumbSize.width*thumbSize.height];        for (int x=0; x<thumbSize.width; x++) {        for (int y=0; y<thumbSize.height; y++) {            int offset = 4*(x*y);            int red = data[offset];            int green = data[offset+1];            int blue = data[offset+2];            int alpha =  data[offset+3];            if (alpha>0) {//去除透明                if (red==255&&green==255&&blue==255) {//去除白色                }else{                    NSArray *clr=@[@(red),@(green),@(blue),@(alpha)];                    [cls addObject:clr];                }            }        }    }    CGContextRelease(context);    //第三步 找到出现次数最多的那个颜色    NSEnumerator *enumerator = [cls objectEnumerator];    NSArray *curColor = nil;    NSArray *MaxColor=nil;    NSUInteger MaxCount=0;    while ( (curColor = [enumerator nextObject]) != nil )    {        NSUInteger tmpCount = [cls countForObject:curColor];        if ( tmpCount < MaxCount ) continue;        MaxCount=tmpCount;        MaxColor=curColor;            }    return [UIColor colorWithRed:([MaxColor[0] intValue]/255.0f) green:([MaxColor[1] intValue]/255.0f) blue:([MaxColor[2] intValue]/255.0f) alpha:([MaxColor[3] intValue]/255.0f)];}
最后的效果也是特别明显的,如图:

源文章的url地址:http://www.cocoachina.com/bbs/read.php?tid=181490.

0 0