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

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

分享到: