当前位置:首页 > PHP教程 > php图像处理 > 列表

PHP实现首字母(截取第一个汉字)生成头像图片

发布:smiling 来源: PHP粉丝网  添加日期:2024-09-29 19:09:44 浏览: 评论:0 

会员系统中,用户如果不上传自定义头像,使用固定图片作为头像未免有些单调。PHP可以实现生成用户名首字母或者第一个汉字(第一个字符)的头像图片,不使用第三方API,第三方虽然图片比较多,但是会有超时。

设计思路

定义了一个letter_avatar函数,接收一个参数$text,表示要生成头像的文字。

使用hash函数计算出$text的哈希值,并将其解包为一个无符号长整型数。

将哈希值对360取余得到一个色相值$hue。

使用hsv2rgb函数将色相、饱和度和亮度转换为RGB分量值。

根据RGB值生成背景颜色$bg。

设定文字颜色$color为白色。

使用mb_strtoupper函数将$text的首字母转为大写。

使用SVG语法生成一个正方形的背景和一个居中的文字。

使用base64_encode函数将SVG代码转为Base64编码。

将Base64编码和前缀data:image/svg+xml;base64,拼接成完整的图片路径。

返回生成的图片路径。 注意:这段代码只是生成了一个头像图片的路径,并没有将图片输出到页面中。如果要在页面中显示头像,需要将生成的图片路径作为<img>标签的src属性值。

完整代码

  1. //1、方法调用测试 
  2.  
  3. letter_avatar("hello"
  4.  
  5. //2、生成图片方法 
  6.  
  7. function letter_avatar($text
  8.  
  9.  
  10.     $total = unpack('L', hash('adler32'$text, true))[1]; 
  11.  
  12.     $hue = $total % 360; 
  13.  
  14.     list($r$g$b) = hsv2rgb($hue / 247, 0.3, 0.9); 
  15.  
  16.     $bg = "rgb(247,186,11)"
  17.  
  18.     $color = "#ffffff"
  19.  
  20.     $first = mb_strtoupper(mb_substr($text, 0, 1)); 
  21.  
  22.     $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>'); 
  23.  
  24.     // 确保图片保存的路径存在 
  25.  
  26.     $tempPath = WEB_PATH . 'temp' . DS . 'avatar' . DS; 
  27.  
  28.     $filename = md5('avatar_' . uniqid()); 
  29.  
  30.     // 生成图片链接 
  31.  
  32.     return base64_to_image_url('data:image/svg+xml;base64,' . $src$tempPath$filename); 
  33.  
  34.  
  35. </details> 
  36.  
  37. //3、生成https访问链接 
  38.  
  39. function base64_to_image_url($base64_string$output_folder$image_name
  40.  
  41.  
  42.     $data = substr($base64_stringstrpos($base64_string',') + 1); 
  43.  
  44.     // 对数据进行Base64解码 
  45.  
  46.     $fileData = base64_decode($data); 
  47.  
  48.     // 创建输出目录如果它不存在 
  49.  
  50.     if (!file_exists($output_folder)) { 
  51.  
  52.         mkdir($output_folder, 0755, true); 
  53.  
  54.     } 
  55.  
  56.     // 将解码后的数据保存到文件 
  57.  
  58.     $file = $output_folder . $image_name . '.svg'
  59.  
  60.     if (file_put_contents($file$fileData)) { 
  61.  
  62.         // 返回图片的URL 
  63.  
  64.         return base_url() . 'temp' . DS . 'avatar' . DS . $image_name'.svg'
  65.  
  66.     } 
  67.  
  68.     return false; 
  69.  
  70.  
  71. //4、RGB 
  72.  
  73. function hsv2rgb($h$s$v
  74.  
  75.  
  76.     $r = $g = $b = 0; 
  77.  
  78.     $i = floor($h * 6); 
  79.  
  80.     $f = $h * 6 - $i
  81.  
  82.     $p = $v * (1 - $s); 
  83.  
  84.     $q = $v * (1 - $f * $s); 
  85.  
  86.     $t = $v * (1 - (1 - $f) * $s); 
  87.  
  88.     switch ($i % 6) { 
  89.  
  90.         case 0: 
  91.  
  92.             $r = $v
  93.  
  94.             $g = $t
  95.  
  96.             $b = $p
  97.  
  98.             break
  99.  
  100.         case 1: 
  101.  
  102.             $r = $q
  103.  
  104.             $g = $v
  105.  
  106.             $b = $p
  107.  
  108.             break
  109.  
  110.         case 2: 
  111.  
  112.             $r = $p
  113.  
  114.             $g = $v
  115.  
  116.             $b = $t
  117.  
  118.             break
  119.  
  120.         case 3: 
  121.  
  122.             $r = $p
  123.  
  124.             $g = $q
  125.  
  126.             $b = $v
  127.  
  128.             break
  129.  
  130.         case 4: 
  131.  
  132.             $r = $t
  133.  
  134.             $g = $p
  135.  
  136.             $b = $v
  137.  
  138.             break
  139.  
  140.         case 5: 
  141.  
  142.             $r = $v
  143.  
  144.             $g = $p
  145.  
  146.             $b = $q
  147.  
  148.             break
  149.  
  150.     } 
  151.  
  152.     return [ 
  153.  
  154.         floor($r * 255), 
  155.  
  156.         floor($g * 255), 
  157.  
  158.         floor($b * 255) 
  159.  
  160.     ]; 
  161.  
  162. }

Tags: PHP实现首字母生成头像图片

分享到: