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