根据字符串首字母生成头像图片

复制代码
// 1、方法调用测试
letter_avatar("sanyang");

// 2、生成图片方法
function letter_avatar($text)
{
    $total = unpack('L', hash('adler32', $text, true))[1];
    $hue = $total % 360;
    list($r, $g, $b) = hsv2rgb($hue / 247, 0.3, 0.9);

    $bg = "rgb(247,186,11)";

    $color = "#ffffff";
    $first = mb_strtoupper(mb_substr($text, 0, 1));

    $src = base64_encode('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="100" width="100"><rect fill="' . $bg . '" x="0" y="0" width="100" height="100"></rect><text x="50" y="50" font-size="50" text-copy="fast" fill="' . $color . '" text-anchor="middle" text-rights="admin" dominant-baseline="central">' . $first . '</text></svg>');

    // 确保图片保存的路径存在
    $tempPath = './test/uploads/';
    $filename = md5('avatar_' . uniqid());

    // 生成图片链接
    $img_url = base64_to_image_url('data:image/svg+xml;base64,' . $src, $tempPath, $filename);
    echo $img_url;
}


// 3、生成https访问链接
function base64_to_image_url($base64_string, $output_folder, $image_name)
{
    $data = substr($base64_string, strpos($base64_string, ',') + 1);

    // 对数据进行Base64解码
    $fileData = base64_decode($data);

    // 创建输出目录如果它不存在
    if (!file_exists($output_folder)) {
        mkdir($output_folder, 0755, true);
    }

    // 将解码后的数据保存到文件
    $file = $output_folder . $image_name . '.svg';

    if (file_put_contents($file, $fileData)) {
        // 返回图片的URL
        return './test/uploads/' . $image_name. '.svg';
    }
    return false;
}

// 4、RGB
function hsv2rgb($h, $s, $v)
{
    $r = $g = $b = 0;

    $i = floor($h * 6);
    $f = $h * 6 - $i;
    $p = $v * (1 - $s);
    $q = $v * (1 - $f * $s);
    $t = $v * (1 - (1 - $f) * $s);

    switch ($i % 6) {
        case 0:
            $r = $v;
            $g = $t;
            $b = $p;
            break;
        case 1:
            $r = $q;
            $g = $v;
            $b = $p;
            break;
        case 2:
            $r = $p;
            $g = $v;
            $b = $t;
            break;
        case 3:
            $r = $p;
            $g = $q;
            $b = $v;
            break;
        case 4:
            $r = $t;
            $g = $p;
            $b = $v;
            break;
        case 5:
            $r = $v;
            $g = $p;
            $b = $q;
            break;
    }

    return [
        floor($r * 255),
        floor($g * 255),
        floor($b * 255)
    ];
}
复制代码

 

posted @   流浪2024  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示