以下是几种使用PHP实现首字母(截取第一个汉字)生成头像图片的方法:
使用内置函数结合SVG生成
以下是一个示例函数,它接受一个字符串作为参数,生成包含该字符串首字母的彩色头像图片路径 :
<?php
function letter_avatar($text) {
// 计算哈希值并转换为无符号长整型数
$total = unpack('L', hash('adler32', $text, true))[1];
// 根据哈希值计算色相值
$hue = $total % 360;
// 将色相、饱和度和亮度转换为RGB分量值
list($r, $g, $b) = hsv2rgb($hue / 360, 0.3, 0.9);
// 生成背景颜色
$bg = "rgb({$r},{$g},{$b})";
// 设置文字颜色为白色
$color = "#ffffff";
// 获取字符串的首字母并转为大写
$first = mb_strtoupper(mb_substr($text, 0, 1));
// 使用SVG语法生成图像内容
$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>');
// 拼接完整的图片路径
$value = 'data:image/svg+xml;base64,'. $src;
return $value;
}
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)
);
}
你可以使用以下方式调用这个函数:
$name = "哈哈";
$logo = letter_avatar($name);
echo '<img lay-src="'.$logo.'" style=" border-radius: 50%;">';
使用 mb_substr()
函数和拼音转换表
这种方法需要一个汉字拼音首字母的转换表,以下是一个简单的示例函数,它通过获取中文字符串的第一个汉字,然后查找其拼音首字母来生成头像图片的首字母 :
<?php
function getFirstCharter($str) {
if(empty($str)){
return '';
}
$fchar = ord($str{0});
if($fchar>=ord('A')&&$fchar<=ord('z')) {
return strtoupper($str{0});
}
$s1 = iconv('UTF-8','gb2312',$str);
$s2 = iconv('gb2312','UTF-8',$s1);
$s = $s2==$str?$s1:$str;
$asc = ord($s{0})*256+ord($s{1})-65536;
if($asc>=-20319&&$asc<=-20284) return 'A';
if($asc>=-20283&&$asc<=-19776) return 'B';
if($asc>=-19775&&$asc<=-19219) return 'C';
if($asc>=-19218&&$asc<=-18711) return 'D';
if($asc>=-18710&&$asc<=-18527) return 'E';
if($asc>=-18526&&$asc<=-18240) return 'F';
if($asc>=-18239&&$asc<=-17923) return 'G';
if($asc>=-17922&&$asc<=-17418) return 'H';
if($asc>=-17417&&$asc<=-16475) return 'J';
if($asc>=-16474&&$asc<=-16213) return 'K';
if($asc>=-16212&&$asc<=-15641) return 'L';
if($asc>=-15640&&$asc<=-15166) return 'M';
if($asc>=-15165&&$asc<=-14923) return 'N';
if($asc>=-14922&&$asc<=-14915) return 'O';
if($asc>=-14914&&$asc<=-14631) return 'P';
if($asc>=-14630&&$asc<=-14150) return 'Q';
if($asc>=-14149&&$asc<=-14091) return 'R';
if($asc>=-14090&&$asc<=-13319) return 'S';
if($asc>=-13318&&$asc<=-12839) return 'T';
if($asc>=-12838&&$asc<=-12557) return 'W';
if($asc>=-12556&&$asc<=-11848) return 'X';
if($asc>=-11847&&$asc<=-11056) return 'Y';
if($asc>=-11055&&$asc<=-10247) return 'Z';
return null;
}
你可以这样调用这个函数来获取首字母:
$string = "中文";
$firstLetter = getFirstCharter($string);
echo $firstLetter;
使用第三方扩展包 PhpSpreadsheet
PhpSpreadsheet
扩展包中的 StringHelper
类也可以用来获取中文字符的首字母,以下是示例代码 :
<?php
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
function getChineseFirstLetter($string) {
$firstChar = StringHelper::substring($string, 0, 1);
$firstLetter = StringHelper::strtoupper(StringHelper::toAscii($firstChar));
return $firstLetter;
}
$string = "中文";
$firstLetter = getChineseFirstLetter($string);
echo $firstLetter;
使用这种方法需要先安装 PhpSpreadsheet
扩展包,并引入相关命名空间和类 。
使用 php-initial-avatar-generator
包
php-initial-avatar-generator
是一个功能强大的PHP包,能够自动生成以姓名首字母为基础的精美头像.以下是安装和使用示例 :
<?php
// 引入自动加载文件
require_once 'vendor/autoload.php';
// 创建头像实例并生成头像
$avatar = new LasseRafn\InitialAvatarGenerator\InitialAvatar();
$image = $avatar->name('李四')->generate();
// 输出头像图片
header('Content-Type: image/png');
echo $image;
使用这个包之前,需要先通过 composer require lasserafn/php-initial-avatar-generator
命令安装该包.