luck-draw/app/service/GdTool.php

140 lines
4.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\service;
use think\Exception;
/**
* GD2库绘画
* Class GdTool
* @package app\service
*/
class GdTool
{
/**
* 生成海报
* 背景尺寸固定: 750 * 1334
*
* @param string $srcQr 生成的二维码base64值
* @param string $bgImg 背景图片 自定义背景图
* @param string $savePath 海报保存路径为空则返回base64值
* @return bool|string
* @throws \Exception
*/
public static function generatePoster(string $srcQr='', string $bgImg = '', string $savePath = '')
{
try {
if (!empty($savePath)) {
if (!is_dir($savePath)) {
@mkdir($savePath, 0777, true);
}
if (!is_dir($savePath) || !is_writeable($savePath)) {
throw new \Exception('无法保存');
}
}
//1、创建画布资源
// 背景尺寸: 750 * 1334
$defBga = app()->getRootPath().'public/static/images/poster-bg1.png';
$srcBga = empty($bgImg) ? $defBga : $bgImg;
$bgInfo = @getimagesize($srcBga);
if ($bgInfo[0] != 750 || $bgInfo[1] != 1334) {
throw new \Exception('海报模板尺寸不正确!');
}
if (!$bgInfo) {
throw new \Exception('海报背景图资源不存在!');
}
$ext = $bgInfo['mime'];
$extName = '';
$img = null;
switch ($ext) {
case 'image/jpeg':
$img = @imagecreatefromjpeg($srcBga);
$extName = 'jpg';
break;
case 'image/png':
$img = @imagecreatefrompng($srcBga);
$extName = 'png';
break;
}
if (!$img) {
throw new \Exception('无效背景图');
}
//2、准备颜色
$black = imagecolorallocate($img,0,0,0);
$while = imagecolorallocate($img,255,255,255);
$faColor = imagecolorallocate($img,0,104,51);
// 邀请人头像
// $headimgurl = 'https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJXE3Zz0U5edXYI2icicYibSNwwezWe0X92fovRtpUwdCF5lAmjsYK5EWT3R8ItO0BEqynElYhWibRqDg/132';
// $headimg = imagecreatefromstring(file_get_contents($headimgurl));
// imagecopymerge($img, $headimg, 50, 1000, 0, 0, 120, 120, 100);
// imagecopyresampled($img, $headimg, 90, 900, 0, 0, 120, 120, 120, 120);
// 添加文字
// imagettftext($img, 18, 0, 220, 1100, 250, public_path().'static/simheittf.ttf', '超级凉面...邀您关注');
//填充画布(背景色)
imagefill($img,0,0, $while);
// 组合二维码图片 坐标x:246; y:959
$prefixPng = 'data:image/png;base64,';
$qrStr = base64_decode(str_replace($prefixPng,"",$srcQr));
$qrImg = @imagecreatefromstring($qrStr);
list($qrWidth, $qrHeight) = getimagesize($srcQr);
if(!$qrImg) {
imagedestroy($img);
throw new \Exception('无效二维码');
}
$imgQrW = $imgQrH = 274;
imagecopyresampled($img, $qrImg, 456, 959, 0, 0, $imgQrW, $imgQrH, $qrWidth, $qrHeight);
imagedestroy($qrImg);
//4、输出与保存最终图像(保存文件或返回base64)
if (empty($savePath)) {
/* 返回base64 */
ob_start();
if ($ext == 'image/jpeg') {
imagejpeg($img);
} else {
imagepng($img);
}
$imgData = ob_get_contents();
ob_end_clean();
imagedestroy($img);
$prefix = 'data:image/jpg/png/gif;base64,';
return $prefix.base64_encode($imgData);
} else {
/* 保存到文件*/
$fileName = md5(microtime(true)).'.'.$extName;
$saveFile = $savePath."/".$fileName;
if ($ext == 'image/jpeg') {
imagejpeg($img, $saveFile);
} else {
imagepng($img, $saveFile);
}
}
/*
* 输出显示
header("content-type: image/png");
imagepng($img);
*/
//5、释放画布资源
imagedestroy($img);
} catch (\Exception $e) {
throw $e;
}
return true;
}
}