先了解下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