我想在 PHP 中将 RGBA 值转换为十六进制。我找到了 RGB 到十六进制的很好的帮助(例如 在 PHP 中将 RGB 转换为十六进制颜色值)。现在我也尝试改变A值。下面尝试一下。有人对我如何做得更好有任何建议吗?
public static function konvertiereRGBzuHEX(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] );
}
其实我不久前就完成了这个任务。
如果我们得到的颜色为
255,255,255,0.123
/(((25[0-5])|(2[0-4]\d)|(1?\d{0,2})|0), *){3}(0|(0\.\d{1,3})|1)$/
因此我们可以制作编码和解码功能
function encode(string $colorString)
{
$colorArray = explode(',', $colorString);
$colorArray[3] *= 255;
$colorBytes = array_map(
fn($part) => pack('C', (int)trim($part)),
$colorArray
);
return implode($colorBytes);
}
function decode($hexColor)
{
//$hexColor = stream_get_contents($hexColor); // If $hexColor is stream
$colorArray = array_values(unpack('C*', $hexColor));
return implode(
',',
[$colorArray[0], $colorArray[1], $colorArray[2], round($colorArray[3]/255, 3)]
);
}
我将我的颜色保存在数据库中。当我需要保存更多颜色时,我将其写入一个十六进制字符串,当我解码时,我将其分成 4 个字节的块
例如我有 ['255,123,125,1', '32,123,23,0.15']
$x = '';
foreach (['255,123,125,1', '32,123,23,0.15'] as $color) {
$x .= $this->encode($color);
}
DB::insertColors($x);
试试这个,也许它会成为你的解决方案的目标