'How to convert RGBA color codes to 8 Digit Hex in PHP?
I'm attempting to convert some rgba values into a format suitable for SubStation Alpha subtitle files. The .ass
file format requires a colour format like &H12345690
where the hex bytes are in blue, green, red, alpha order.
I am finding examples converting 8 digit hex colors into RGBA, but not the other way around. Here is a function I put together based one of the answers, but I the alpha channel is always returned as zero:
function rgbtohex($string) {
$string = str_replace("rgba","",$string);
$string = str_replace("rgb","",$string);
$string = str_replace("(","",$string);
$string = str_replace(")","",$string);
$colorexplode = explode(",",$string);
$hex = '&H';
foreach($colorexplode AS $c) {
echo "C" . $c . " " . dechex($c) . "<br><br>";
$hex .= dechex($c);
}
return $hex;
}
But if I test it with rgba(123,223,215,.9)
it produces &H7bdfd70
which only has 7 characters instead of 8.
Also, the alpha channel (.9) always comes out to zero, so that doesn't appear to be working correctly.
Solution 1:[1]
You can use the printf()
family of functions to convert to a properly padded hex string. Decimals cannot be represented in hex, so the value is taken as a fraction of 0xFF.
$rgba = "rgba(123,100,23,.5)";
// get the values
preg_match_all("/([\\d.]+)/", $rgba, $matches);
// output
$hex = sprintf(
"&H%02X%02X%02X%02X",
$matches[1][2], // blue
$matches[1][1], // green
$matches[1][0], // red
$matches[1][3] * 255, // adjusted opacity
);
echo $hex;
Output:
&H17647B7F
Solution 2:[2]
You can use the dechex() function to convert each param of your rgba color to a 2 hex digit.
So in your example you have to concat each part of the rgba to get the hex value of your color :
dechex(123).dechex(100).dechex(23).dechex(0.5)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Guillaume |