I want to convert an RGBA value to HEX in PHP. I have found good help for RGB to HEX (e.g. Convert RGB to hex color values in PHP). Now I have made an attempt to change the A value as well (e.g rgba(80,80,80,0.5) to maybe #D3D3D3 (6 digits)). Assuming, of course, that the background is white.
Below the attempt.
Does anyone have any tips on how I could do this better?
How do I get a matching colour but lighter?
public static function convertRGBAtoHEX6(string $rgba): string
{
if ( strpos( $rgba, '#' ) === 0 ) {
return $rgba;
}
preg_match( '/^rgba?[s+]?([s+]?(d+)[s+]?,[s+]?(d+)[s+]?,[s+]?(d+)[s+]?,[s+]?(d+)[s+]?/i', $rgba, $by_color );
if(isset($by_color[4]))
{
$by_color[4] = 2 - $by_color[4];
$by_color[1] = $by_color[1] * $by_color[4];
$by_color[2] = $by_color[2] * $by_color[4];
$by_color[3] = $by_color[3] * $by_color[4];
}
return sprintf( '#%02x%02x%02x', $by_color[1], $by_color[2], $by_color[3] );
}
2
Answers
Actually i made this task small time ago.
If we get color as
255,255,255,0.123
So we create reg to check
/(((25[0-5])|(2[0-4]d)|(1?d{0,2})|0), *){3}(0|(0.d{1,3})|1)$/
So we can make encode and decode functions
I save so my colors in a DB. When I need to save more colors I write it in one hex string and when I decode I divide it into chunk of 4 bytes
Example I have [‘255,123,125,1’, ‘32,123,23,0.15’]
result will:
Try this, may be it make target on your solution
I came up with this solution:
See: https://3v4l.org/ick2o
The result is:
"#a7a7a7"
.The code is basically the same as yours with the exception of the
blendChannels()
function and I got rid of that horrible regular expression.The
blendChannels()
function takes the needed amount from the two supplied channels. If alpha is 1.0 the output is equal to channel 1, if alpha is 0.0 the outout is equal to channel 2, and if alpha is 0.5 an equal amount is taken from both channels. Do this for all 3 channels and you’re done.