2017-04-11 37 views
-1

我有一張圖像,我想根據變量設置的顏色更改顏色。我遇到的問題是,該值來自數據源作爲十六進制,而imagecolourset與rgb一起使用。 我已成立了一個轉換功能:如何將十六進制轉換爲rgb以便它可以與imagecolourset一起使用?

function hex2rgb($hex) { 
$hex = str_replace("#", "", $hex); 

if(strlen($hex) == 3) { 
    $r = hexdec(substr($hex,0,1).substr($hex,0,1)); 
    $g = hexdec(substr($hex,1,1).substr($hex,1,1)); 
    $b = hexdec(substr($hex,2,1).substr($hex,2,1)); 
} else { 
    $r = hexdec(substr($hex,0,2)); 
    $g = hexdec(substr($hex,2,2)); 
    $b = hexdec(substr($hex,4,2)); 
} 
$rgb = array($r, $g, $b); 
    return implode(",", $rgb); // returns the rgb values separated by commas 

} 

,然後用這個像這樣:

$homeRGB = hex2rgb($homeColour); 
imagecolorset($him,$hindex, $homeRGB); 

,但我得到一個錯誤消息說,imagecolorset只節選5個參數而且只有3套。結果應該打印225,225,225,所以我不明白爲什麼它只讀取1個參數而不是3個。如果我手動輸入225,225,225,那麼代碼工作正常。不知道我去哪裏錯了?

回答

0

您試圖傳遞數據類型STRING的變量,而PHP函數imagecolorset()需要您將rgb值作爲數據類型INTEGER的三個單獨參數傳遞。

一般而言,當涉及到Type Juggling時,PHP是相當寬容的,但can not pass a comma separated string作爲函數參數,期望該字符串的內容被視爲單獨的參數。它將被視爲一個參數,即使該字符串包含逗號。

而是改變你的函數返回一個數組:

function hex2rgb($hex) { 
    $hex = str_replace("#", "", $hex); 

    if(strlen($hex) == 3) { 
     $r = hexdec(substr($hex,0,1).substr($hex,0,1)); 
     $g = hexdec(substr($hex,1,1).substr($hex,1,1)); 
     $b = hexdec(substr($hex,2,1).substr($hex,2,1)); 
    } else { 
     $r = hexdec(substr($hex,0,2)); 
     $g = hexdec(substr($hex,2,2)); 
     $b = hexdec(substr($hex,4,2)); 
    } 
    return array($r, $g, $b); // RETURN ARRAY INSTEAD OF STRING 
} 

,然後用它喜歡:

$homeRGB = hex2rgb($homeColour); 
imagecolorset($him,$hindex, $homeRGB[0], $homeRGB[1], $homeRGB[2]); 

如果你因爲某些原因絕對不能或不會改變hex2rgb - 功能,解決方法將使用call_user_func_array()

$homeRGB = hex2rgb($homeColour); 
call_user_func_array('imagecolorset', array_merge(array($him, $hindex), explode(',', $homeRGB))); 

它是不建議,但由於不必要的內爆和爆炸等開銷。

+0

我曾試圖把結果變成整數使用不同的方法,但沒有奏效。非常感謝你的幫助 :-) – rmsGreig

相關問題