2017-04-11 52 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