由于项目需要,有些内容固定了。
function sharePNG($id, $avatarPath = '', $name = '', $desc = '')
{
if(substr($avatarPath,0,2) == '//'){
$avatarPath = (\request()->protocol() == 'HTTP/1.1'?'http':'https').":$avatarPath";
}
$len = mb_strlen($name);
if($len > 11){
$name = mb_substr($name,0,11).'...';
}
$path = public_path("/static");
$path_2 = empty($avatarPath) ? "{$path}fe/avatar.png" : $avatarPath;
//背景图片对象
$fromImageInfo = getimagesize($path_2);
if (!isset($fromImageInfo['bits']) || $fromImageInfo['bits'] >= 1024) {
$path_2 = "{$path}fe/avatar.png";
}
$path_1 = "{$path}fe/share-bg.png";
$ttf = "{$path}font/weiruanyahei.ttf";
//创建图片对象
$image_1 = imagecreatefrompng($path_1);
$image_2 = radius_img($path_2); // 见 /index.php/archives/146/
//缩放图片
// 获取图像信息
list($bigWidth, $bigHight) = $fromImageInfo;
//图片缩放,可以根据原图片大小在这里计算等比缩放
$width = 30;
$height = 30;
// 创建缩略图画板
$newImage = imagecreatetruecolor($width, $height);
// 启用混色模式
imagealphablending($newImage, false);
// 保存PNG alpha通道信息
imagesavealpha($newImage, true);
//缩放
imagecopyresampled($newImage, $image_2, 0, 0, 0, 0, $width, $height, $bigWidth, $bigHight);
//合成图片
//imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )---拷贝并合并图像的一部分
//将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。
//两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。
imagecopymerge($image_1, $newImage, 10, 125, 0, 0, imagesx($newImage), imagesy($newImage), 100);
$col = imagecolorallocatealpha($image_1, 0, 0, 0, 0);
// 设置文字
imagettftext($image_1, 10, 0, 47, 138, $col, $ttf, $name);
$col2 = imagecolorallocatealpha($image_1, 171, 171, 171, 0);
imagettftext($image_1, 8, 0, 47, 153, $col2, $ttf, $desc);
if (!is_dir("{$path}/sharePNG")) {
mkdir("{$path}/sharePNG", 755);
}
$fullPath = "{$path}/sharePNG/$id.png";
if (file_exists($fullPath)) {
unlink($fullPath);
}
if (imagepng($image_1, $fullPath)) {
return "/static/sharePNG/$id.png";
}
return false;
}