IOS 關(guān)于根據(jù)圖片的色度返回整體顏色情況,一般用于設(shè)置背景圖片后設(shè)置其他顏色不顯得突兀

RGB和HSV區(qū)別與互相轉(zhuǎn)換

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容