php渐变颜色

编程记录 · 2023-04-17
 
/* 颜色渐变*/
 
function extract16color($color16) {
 
    $mask16 = "0123456789ABCDEF";
    $true_color = [0, 0, 0];
    $color16 = mb_substr($color16, 1);
 
    for ($i = 0; $i < 3; $i++) {
 
        $color16_temp = [mb_substr($color16, $i * 2, 1), mb_substr($color16, $i * 2 + 1, 1)];
 
        for ($j = 0; $j < 2; $j++) {
 
            for ($k = 0; $k < 15; $k++) {
 
                if ($color16_temp[$j] == $mask16[$k]) {
 
                    $color16_temp[$j] = $k;
 
                    break;
 
                }
 
            }
 
        }
 
        $true_color[$i] = intval($color16_temp[0]) * 16 + intval($color16_temp[1]);
 
    }
 
    return $true_color;
 
}
 
function make16color($color10) {
 
    $mask16 = "0123456789ABCDEF";
    $true_color = "#";
 
    for ($i = 0; $i < 3; $i++) {
 
        $color10_temp = $color10[$i];
        $true_color.= $mask16[intval($color10_temp / 16)];
        $true_color.= $mask16[intval($color10_temp % 16)];
 
    }
 
    return $true_color;
 
}
 
function str2gradient($text, $sColor, $eColor) {
 
    $text = trim($text);
    $sColor = preg_match("#^\#[a-f0-9]{6}$#i", $sColor) ? $sColor : "#000000";
    $eColor = preg_match("#^\#[a-f0-9]{6}$#i", $eColor) ? $eColor : "#000000";
 
    $color_move = [0, 0, 0];
    $color_add = [0, 0, 0];
    $length = mb_strlen($text);
    $output = NULL;
    $copy_color = NULL;
    $current_color = NULL;
    $max = 0;
 
    if ($length > 0) {
 
        $sColor = extract16color($sColor);
        $eColor = extract16color($eColor);
        $cColor = $sColor;
 
        for ($i = 0; $i < 3; $i++) {
 
            $temp = $sColor[$i] - intval($eColor[$i]);
            $temp_a = abs($temp); 
            $color_add[$i] = $temp_a;
 
            if ($temp_a > $max) {
 
                $max = $temp_a;
 
            }
 
            if ($temp < 0) {
 
                $color_move[$i] = 1;
 
            } elseif ($temp > 0) {
 
                $color_move[$i] = -1;
 
            } else {
 
                $color_move[$i] = 0;
 
            }
 
        }
 
        for ($i = 0; $i < $length; $i++) {
 
            $char = mb_substr($text, $i, 1);
            $koeff_add = $max / $length / $max * 100;
 
            for ($j = 0; $j < 3; $j++) {
 
                $add = intval($color_add[$j]) / 100 * intval($koeff_add) * intval($color_move[$j]);
                $cColor[$j] += $add;
 
            }
 
            $current_color = make16color($cColor);
 
            if ($i == 0) {
 
                $output.= '<font color="'.$current_color.'">'.$char;
                $copy_color = $current_color;
 
            } else {
 
                if ($current_color == $copy_color || $char == " ") {
 
                    $output.= $char;
 
                } else {
 
                    $output.= '</font><font color="'.$current_color.'">'.$char;
                    $copy_color = $current_color;
 
                }
 
            }
 
        }
 
        if (mb_strlen($output)) {
 
            $output.= '</font>';
 
        }
 
        return $output;
 
    }
 
}
 
// test
echo str2gradient('Hello, World! 你好,世界!', '#800000', '#000080');
 
Theme Jasmine by Kent Liao
辽ICP备2021009421号-2