PHP 不透明度乘法
PHP Opacity multiplication
所以我有一个像这样的字符串 "rgba(66, 66, 66, 1)" 我怎样才能将它的最后一位或数字乘以 255。它还需要符合 rgba(214, 234, 216, 0.6)例子。我不确定如何做到这一点,因为 rgb 方面和不透明度每次都可能不同。
简单地使用爆炸,将它在 ',' 上拆分成一个数组:
$arr=explode(',',$string);
您可能会对第 4 个项目($arr[3])进行 floatval 处理:
$arr[3]=255*floatval($arr[3]);
然后使用 implode() 函数将其加入备份(记得在 ')' 上添加,我们的 floatval 将丢失:
$string=implode(',',$arr).")";
应该可以。
这是一个工作函数,它解析 rgba 格式和 returns 具有每种颜色的数组,以及将浮点 alpha 值缩放到 0-255。它还将所有值限制在 0-255 之间,以防止超出该范围的溢出。如果传入无效的 rgb 字符串,函数 returns false.
函数(demo):
/**
* Parses an RGBA string and returns and array with each color
* @param string $str The RGBA string, ex: "rgba(66, 66, 66, 1)"
* @return array Returns an array with each r, g, b and a value or false if an invalid string is passed in.
*/
function parseRGBA($str){
//match the rgba string and get it's part
if(preg_match('/rgba\( *([\d\.-]+), *([\d\.-]+), *([\d\.-]+), *([\d\.-]+) *\)/i', $str, $m)){
$out = array(
'r'=>intval($m[1]), //get the red
'g'=>intval($m[2]), //get the green
'b'=>intval($m[3]), //get the blue
'a'=>round(floatval($m[4]) * 255), //get the alpha and scale to 0-255
);
//clamp each value between 0 and 255
array_walk($out, function(&$v){ $v = min(255, max(0, $v)); });
return $out;
}
return false;
}
示例:
echo '<pre>';
echo "Normal value: ";
print_r(parseRGBA("rgba(66, 66, 66, 1)"));
echo "Red > 255: ";
print_r(parseRGBA("rgba(660, 66, 66, 1)"));
echo "Green < 0: ";
print_r(parseRGBA("rgba(66, -66, 66, 1)"));
echo "Alpha float (normal): ";
print_r(parseRGBA("rgba(66, 66, 66, 0.6)"));
echo "Alpha overflow: ";
print_r(parseRGBA("rgba(66, 66, 66, 10)"));
输出:
Normal value: Array
(
[r] => 66
[g] => 66
[b] => 66
[a] => 255
)
Red > 255: Array
(
[r] => 255
[g] => 66
[b] => 66
[a] => 255
)
Green < 0: Array
(
[r] => 66
[g] => 0
[b] => 66
[a] => 255
)
Alpha float (normal): Array
(
[r] => 66
[g] => 66
[b] => 66
[a] => 153
)
Alpha overflow: Array
(
[r] => 66
[g] => 66
[b] => 66
[a] => 255
)
所以我有一个像这样的字符串 "rgba(66, 66, 66, 1)" 我怎样才能将它的最后一位或数字乘以 255。它还需要符合 rgba(214, 234, 216, 0.6)例子。我不确定如何做到这一点,因为 rgb 方面和不透明度每次都可能不同。
简单地使用爆炸,将它在 ',' 上拆分成一个数组:
$arr=explode(',',$string);
您可能会对第 4 个项目($arr[3])进行 floatval 处理:
$arr[3]=255*floatval($arr[3]);
然后使用 implode() 函数将其加入备份(记得在 ')' 上添加,我们的 floatval 将丢失:
$string=implode(',',$arr).")";
应该可以。
这是一个工作函数,它解析 rgba 格式和 returns 具有每种颜色的数组,以及将浮点 alpha 值缩放到 0-255。它还将所有值限制在 0-255 之间,以防止超出该范围的溢出。如果传入无效的 rgb 字符串,函数 returns false.
函数(demo):
/**
* Parses an RGBA string and returns and array with each color
* @param string $str The RGBA string, ex: "rgba(66, 66, 66, 1)"
* @return array Returns an array with each r, g, b and a value or false if an invalid string is passed in.
*/
function parseRGBA($str){
//match the rgba string and get it's part
if(preg_match('/rgba\( *([\d\.-]+), *([\d\.-]+), *([\d\.-]+), *([\d\.-]+) *\)/i', $str, $m)){
$out = array(
'r'=>intval($m[1]), //get the red
'g'=>intval($m[2]), //get the green
'b'=>intval($m[3]), //get the blue
'a'=>round(floatval($m[4]) * 255), //get the alpha and scale to 0-255
);
//clamp each value between 0 and 255
array_walk($out, function(&$v){ $v = min(255, max(0, $v)); });
return $out;
}
return false;
}
示例:
echo '<pre>';
echo "Normal value: ";
print_r(parseRGBA("rgba(66, 66, 66, 1)"));
echo "Red > 255: ";
print_r(parseRGBA("rgba(660, 66, 66, 1)"));
echo "Green < 0: ";
print_r(parseRGBA("rgba(66, -66, 66, 1)"));
echo "Alpha float (normal): ";
print_r(parseRGBA("rgba(66, 66, 66, 0.6)"));
echo "Alpha overflow: ";
print_r(parseRGBA("rgba(66, 66, 66, 10)"));
输出:
Normal value: Array
(
[r] => 66
[g] => 66
[b] => 66
[a] => 255
)
Red > 255: Array
(
[r] => 255
[g] => 66
[b] => 66
[a] => 255
)
Green < 0: Array
(
[r] => 66
[g] => 0
[b] => 66
[a] => 255
)
Alpha float (normal): Array
(
[r] => 66
[g] => 66
[b] => 66
[a] => 153
)
Alpha overflow: Array
(
[r] => 66
[g] => 66
[b] => 66
[a] => 255
)