从图片中取出像素出现次数最多的颜色(取出图片主色)

来源:互联网 发布:linux内网建站 编辑:程序博客网 时间:2024/05/01 23:42

 在项目中,有时为了美观,需要将界面背景或文字颜色依照图片颜色而改变,

此时可使用一下方法。


首先创建UIImage的类目,然后在类目中添加以下方法:

-(UIColor*)mostColor{

    

    

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1

    int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;

#else

    int bitmapInfo = kCGImageAlphaPremultipliedLast;

#endif

    

    //第一步 先把图片缩小 加快计算速度但越小结果误差可能越大

    CGSize thumbSize=CGSizeMake(5050);

    

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef context = CGBitmapContextCreate(NULL,

                                                 thumbSize.width,

                                                 thumbSize.height,

                                                 8,//bits per component

                                                 thumbSize.width*4,

                                                 colorSpace,

                                                 bitmapInfo);

    

    CGRect drawRect = CGRectMake(00, thumbSize.width, thumbSize.height);

    CGContextDrawImage(context, drawRect, self.CGImage);

    CGColorSpaceRelease(colorSpace);

    

    

    

    //第二步 取每个点的像素值

    unsigned char* data = CGBitmapContextGetData (context);

    

    if (data == NULLreturn 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];

            

            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[0intValue]/255.0fgreen:([MaxColor[1]intValue]/255.0fblue:([MaxColor[2intValue]/255.0falpha:([MaxColor[3]intValue]/255.0f)];

}


1 0
原创粉丝点击