2011-07-15 161 views
3

是否有一個PHP函數返回最接近的顏色通過給rgb或十六進制顏色作爲參數?我已經燒了很多東西,但找不到能夠完成這項工作的功能。Php函數十六進制或rgb顏色的顏色名稱

請幫

+3

當你說「最接近」 - 你的意思是?考慮到R,G和B都在0x00和0xFF之間的標準RGB,您將獲得超過1650萬種顏色。他們中的大多數甚至沒有分配給他們的專有名稱。 –

+0

這可能不是最好的方法,因爲你會有幾個不同的顏色具有相同的名稱。爲什麼不只顯示顏色而不是列出其名稱? – dqhendricks

回答

1

沒有這樣的功能,

你需要編寫自己的功能,其獲取的R,G和B值induvidualy, 並循環到每一個值,並找出笏最接近的是(總R和G和B的OFSET最小)

,你可以在這裏找到所有HTML colornames:http://www.w3.org/TR/SVG/types.html#ColorKeywords


ex:

用戶給出[250,1,2](olwost紅色)。你有一個陣列:

$input = [255,1,2] 
$colors = array("red" => [255,0,0],"green"=>[0,255,0]) // used JS array to be quiker 

foreach($ .. as .. $color){ // or a sort function? 
// get diff, key 0 is red key 2 is blue 
$diff = abs($input[0] - $color[0]) + ... + abs($input[2] - $color[2]); 
} 

紅將具有一個diff:5 + 1 + 2 綠色將有:250 + 254 + 2 藍色是:250 + 1 + 253

紅色有最低的總和,所以它必須變紅。 藍色是未來,然後來綠色

+0

你能舉個例子嗎? –

+0

見上面編輯^ – beardhatcode

+0

對不起,我stil沒有得到它: 現在我有這個: $ arr_input = array(255,1,2]); $ arr_colors =陣列( \t '紅' \t => \t 255,0,0, \t '綠色' \t => \t 0,255,0 ); function returnColorNameByRgbcolor($ rgb_color); \t的foreach($ arr_colors爲$顏色){ \t \t //獲取DIFF,關鍵是0紅鍵2是藍色 \t \t回聲$ arr_input [0]; \t \t \t \t // echo $ arr_input [0] - $ color [0]。 ' - '。 $ arr_input [1] - $ color [1]。 ' - '。 $ arr_input [2] - $ color [2]; \t \t $ diff = abs($ arr_input [0] - $ color [0])+ abs($ arr_input [1] - $ color [1])+ abs($ arr_input [2] - $ color [2]) ; \t \t echo $ diff。'
'; \t \t // echo $ diff。 '
'; \t \t \t} \t \t回$ COLOR_NAME; } –

2

請參閱下面我的代碼。我使用它來複制徽標顏色以在運行時自動更改網站主題。希望它有效!

只需傳遞圖像URL作爲函數中的參數即可。

function CopyLogoColor($logo_path){ 
    $i = imagecreatefromjpeg($logo_path); 

    $rTotal = 0; 
    $gTotal =0; 
    $bTotal = 0; 
    $total = 0; 

    for ($x=0 ; $x<imagesx($i) ; $x++){ 
     for ($y=0 ; $y<imagesy($i) ; $y++) { 
      $rgb = imagecolorat($i,$x,$y); 
      $r = ($rgb >> 16) & 0xFF; 
      $g = ($rgb >> 8)& 0xFF; 
      $b = $rgb & 0xFF; 

      $rTotal += $r; 
      $gTotal += $g; 
      $bTotal += $b; 
      $total++; 

     } 
    } 

    $rAverage = round($rTotal/$total); 
    $gAverage = round($gTotal/$total); 
    $bAverage = round($bTotal/$total); 



    $r = intval($rAverage); 
    $g = intval($gAverage); 
    $b = intval($bAverage); 

    $r = dechex($r<0?0:($r>255?255:$r)); 
    $g = dechex($g<0?0:($g>255?255:$g)); 
    $b = dechex($b<0?0:($b>255?255:$b)); 

    $color = (strlen($r) < 2?'0':'').$r; 
    $color .= (strlen($g) < 2?'0':'').$g; 
    $color .= (strlen($b) < 2?'0':'').$b; 

    return '#'.$color; 

} 
相關問題