IOS 关于根据图片的色度返回整体颜色情况,一般用于设置背景图片后设置其他颜色不显得突兀

RGB和HSV区别与互相转换

先了解下RGB和HSV 区别

1. RGB模型。

三维坐标:

RGB:三原色

Red, Green, Blue

原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。

用RGB来理解色彩、深浅、明暗变化:

色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线

深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离

明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮

2. HSV模型

倒锥形模型:

这个模型就是按色彩、深浅、明暗来描述的。

H是色彩

S是深浅, S = 0时,只有灰度

V是明暗,表示色彩的明亮程度,但与光强无直接联系,(意思是有一点点联系吧)。

3. RGB与HSV的联系

从上面的直观的理解,把RGB三维坐标的中轴线立起来,并扁化,就能形成HSV的锥形模型了。

但V与强度无直接关系,因为它只选取了RGB的一个最大分量。而RGB则能反映光照强度(或灰度)的变化。

v = max(r, g, b)

由RGB到HSV的转换:

"HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。

#import"UIImage+GetImageMostColor.h"

staticvoidRGBtoHSV(floatr,floatg,floatb,float*h,float*s,float*v )

{

floatmin, max, delta;

min =MIN( r,MIN( g, b ));

max =MAX( r,MAX( g, b ));

*v = max;// v

delta = max - min;

if( max !=0)

*s = delta / max;// s

else{

// r = g = b = 0        // s = 0, v is undefined

*s =0;

*h = -1;

return;

}

if( r == max )

*h = ( g - b ) / delta;// between yellow & magenta

elseif( g == max )

*h =2+ ( b - r ) / delta;// between cyan & yellow

else

*h =4+ ( r - g ) / delta;// between magenta & cyan

*h *=60;// degrees

if( *h <0)

*h +=360;

}

@implementationUIImage (GetImageMostColor)

+(UIColor*)mostColor:(UIImage*)image{

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1

intbitmapInfo =kCGBitmapByteOrderDefault|kCGImageAlphaPremultipliedLast;

#else

intbitmapInfo = kCGImageAlphaPremultipliedLast;

#endif

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

CGSizethumbSize=CGSizeMake(40,40);

CGColorSpaceRefcolorSpace =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);

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

unsignedchar* data =CGBitmapContextGetData(context);

if(data ==NULL)returnnil;

NSArray*MaxColor=nil;

// NSCountedSet *cls=[NSCountedSet setWithCapacity:thumbSize.width*thumbSize.height];

floatmaxScore=0;

for(intx=0; x

intoffset =4*x;

intred = data[offset];

intgreen = data[offset+1];

intblue = data[offset+2];

intalpha =  data[offset+3];

if(alpha<25)continue;

floath,s,v;

RGBtoHSV(red, green, blue, &h, &s, &v);

floaty =MIN(abs(red*2104+green*4130+blue*802+4096+131072)>>13,235);

y= (y-16)/(235-16);

if(y>0.9)continue;

floatscore = (s+0.1)*x;

if(score>maxScore) {

maxScore = score;

}

MaxColor=@[@(red),@(green),@(blue),@(alpha)];

//[cls addObject:clr];

}

CGContextRelease(context);

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

}

@end

你可能感兴趣的:(IOS 关于根据图片的色度返回整体颜色情况,一般用于设置背景图片后设置其他颜色不显得突兀)