iOS UIImage:获取图片主色调

时间:2021-05-16 08:57:05

本文转载至 http://www.wahenzan.com/a/mdev/ios/2015/0325/1677.html

-(UIColor*)mostColor{

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1

int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;

#else

int bitmapInfo = kCGImageAlphaPremultipliedLast;

#endif

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

CGSize thumbSize=CGSizeMake(50, 50);

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, self.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];

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)];

}

[代码分享]UIImage:获取图片主色调

http://www.cocoachina.com/bbs/read.php?tid=181490
http://www.wahenzan.com/a/mdev/ios/2015/0325/1677.html