公司要求搞一个根据banner主颜色要改变导航条以及背景颜色的需求
首先想到的是要让后台加个颜色字段,然后直接读取。后来想试试本地实现自力更生
然后贴了一段传入图片然后根据图片的每一个点计算颜色取颜色出现最多的那个为主色调
+(UIColor*)mostColor:(UIImage*)image
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
int bitmapInfo =kCGBitmapByteOrderDefault|kCGImageAlphaPremultipliedLast;
#else
intbitmapInfo = kCGImageAlphaPremultipliedLast
#endif
//第一步 先把图片缩小 加快计算速度. 但越小结果误差可能越大
CGSizethumbSize=CGSizeMake(image.size.width/2,image.size.height/2);
CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceRGB();
CGContextRefcontext =CGBitmapContextCreate(NULL,thumbSize.width,thumbSize.height,8,//bits per component
thumbSize.width*4,
colorSpace,bitmapInfo);
CGRectdrawRect=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=[NSCountedSetsetWithCapacity:thumbSize.width*thumbSize.height];
//为了降低遍历次数 扩大了像素的点 但是会影响取值的准确性
for(intx=thumbSize.width/6; x<(thumbSize.width*2/3); x+=15)
{
for(inty=20; y<(thumbSize.height/2)+20; y+=10)
{
intoffset =4*(x*y);
intred =data[offset];
intgreen =data[offset+1];
intblue = data[offset+2];
intalpha = data[offset+3];
if(alpha>0)
{//去除透明
if(red==255&&green==255&&blue==255)
{//去除白色
}else
{
NSArray*clr=@[@(red),@(green),@(blue),@(alpha)];
[clsaddObject:clr];
}
}
}
}
CGContextRelease(context);
//第三步 找到出现次数最多的那个颜色
NSEnumerator*enumerator=[clsobjectEnumerator];
NSArray*curColor =nil;
NSArray*MaxColor=nil;
NSUIntegerMaxCount=0;
while((curColor =[enumeratornextObject])!=nil)
{
NSUIntegertmpCount=[clscountForObject:curColor];
if(tmpCountcontinue;
MaxCount=tmpCount;
MaxColor=curColor;
}
return[UIColorcolorWithRed:([MaxColor[0]intValue]/255.0f)green:([MaxColor[1]intValue]/255.0f)blue:([MaxColor[2]intValue]/255.0f)alpha:([MaxColor[3]intValue]/255.0f)];
}
网友评论