会员系统中,用户如果不上传自定义头像,使用固定图片作为头像未免有些单调。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,拼接成完整的图片路径。
返回生成的图片路径。 注意:这段代码只是生成了一个头像图片的路径,并没有将图片输出到页面中。如果要在页面中显示头像,需要将生成的图片路径作为标签的src属性值。
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | //1、方法调用测试 letter_avatar( "hello" ) //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 ( '' . $first . '' ); // 确保图片保存的路径存在 $tempPath = WEB_PATH . 'temp' . DS . 'avatar' . DS; $filename = md5( 'avatar_' . uniqid()); // 生成图片链接 return base64_to_image_url( 'data:image/svg+xml;base64,' . $src , $tempPath , $filename ); } //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 base_url() . 'temp' . DS . 'avatar' . DS . $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) ]; } |
总结
到此这篇关于PHP实现首字母(截取第一个汉字)生成头像图片的文章就介绍到这了,更多相关PHP字母或汉字生成头像内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!