先了解下RGB和HSV 區(qū)別
1. RGB模型。
三維坐標(biāo):
RGB:三原色
Red, Green, Blue
原點(diǎn)到白色頂點(diǎn)的中軸線(xiàn)是灰度線(xiàn),r、g、b三分量相等,強(qiáng)度可以由三分量的向量表示。
用RGB來(lái)理解色彩、深淺、明暗變化:
色彩變化: 三個(gè)坐標(biāo)軸RGB最大分量頂點(diǎn)與黃紫青YMC色頂點(diǎn)的連線(xiàn)
深淺變化:RGB頂點(diǎn)和CMY頂點(diǎn)到原點(diǎn)和白色頂點(diǎn)的中軸線(xiàn)的距離
明暗變化:中軸線(xiàn)的點(diǎn)的位置,到原點(diǎn),就偏暗,到白色頂點(diǎn)就偏亮
2. HSV模型
倒錐形模型:
這個(gè)模型就是按色彩、深淺、明暗來(lái)描述的。
H是色彩
S是深淺, S = 0時(shí),只有灰度
V是明暗,表示色彩的明亮程度,但與光強(qiáng)無(wú)直接聯(lián)系,(意思是有一點(diǎn)點(diǎn)聯(lián)系吧)。
3. RGB與HSV的聯(lián)系
從上面的直觀(guān)的理解,把RGB三維坐標(biāo)的中軸線(xiàn)立起來(lái),并扁化,就能形成HSV的錐形模型了。
但V與強(qiáng)度無(wú)直接關(guān)系,因?yàn)樗贿x取了RGB的一個(gè)最大分量。而RGB則能反映光照強(qiáng)度(或灰度)的變化。
v = max(r, g, b)
由RGB到HSV的轉(zhuǎn)換:
"HSV對(duì)用戶(hù)來(lái)說(shuō)是一種直觀(guān)的顏色模型。我們可以從一種純色彩開(kāi)始,即指定色彩角H,并讓V=S=1,然后我們可以通過(guò)向其中加入黑色和白色來(lái)得到我們需要的顏色。增加黑色可以減小V而S不變,同樣增加白色可以減小S而V不變。例如,要得到深藍(lán)色,V=0.4 S=1 H=240度。要得到淡藍(lán)色,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
//第一步先把圖片縮小加快計(jì)算速度.但越小結(jié)果誤差可能越大
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);
//第二步取每個(gè)點(diǎn)的像素值
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