问题:
用户注册的过程中,没有上传用户头像,在一些需要使用头像的功能中缺失该模块。
使用统一的头像占位又缺乏头像的多样性,识别度非常低。
思路:
语言:PHP
php库:GD库
框架:Laravel
思路:
- 创建画布---------imagecreate();
- 填充文案到画布里---------imagefttext();
- 生成图像并保持本地---------imagepng();
具体代码
一、创建纯色画布
//创建画布
$image = imagecreate(200,200);
//为画布分配颜色
$color = imagecolorallocate($image,255,255,255);
//填充颜色到背景
imagefilledrectangle($image, 0, 0, 199, 199, $color);
注意事项:设置颜色的时候需要通过imagecolorallocate()为画布分配颜色
这些参数是0-255的整数或者十六进制的0x00-0xFF。
二、加载字体并计算文字的位置
//生成头像的文字
$text = "慢";
//加载字体
$font_file = public_path('tools/avatar/fonts/msyhbd.ttf');
// 计算字符的宽高 获得字体初始的8个相对位置
$pos = ImageTTFBBox(61,0,$font_file,$text);
// 居中公式 (画布宽 - 字体的宽度)/ 2 - 字体初始位置的偏移量
$left_x = intval((200 - abs($pos[2] - $pos[0])) / 2 - abs($pos[0]));
$left_y = intval((200 - abs($pos[5] - $pos[3])) / 2 + abs($pos[5]));
注意事项:字体需要自己先下载到项目中;
导入字体才能计算字体的相对位置;
字体的宽度参照获得的8个相对坐标进行计算;
三、生成图像并保持本地
//为字体分配颜色
$color2 = imagecolorallocate($image,0,0,0);
//填充文案到画布里
imagefttext($image,61,0,$left_x,$left_y,$color2,$font_file,$text);
//文件名称,避免重复生成
$fileName = 'logo_'.time().'.png';
//本地存储路径
$localFilePath = public_path('tools/avatar/img/'.$fileName);
//生成图像并保持本地
imagepng($image,$localFilePath);
注意事项:
你也可以直接再浏览器中输出图片。
在代码的开头加上一句:header('Content-Type:image/png');设置文件类型为图像;
结尾删除本地存储路径的参数imagepng($image);
四、结尾
步骤比较简单,当然也利用GD库生成验证码。
有不足之处欢迎留言讨论,我会不定时查看聊天室的留言信息。
文章最后有整理好的头像生成小工具。
转载请注明出处!【慢慢来】https://www.slowblog.cn/article_item/387277