127 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			127 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?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']; | |||
|  |             $img        = null; | |||
|  |             switch ($ext) { | |||
|  |                 case 'image/jpeg': | |||
|  |                     $img = @imagecreatefromjpeg($srcBga); | |||
|  |                     break; | |||
|  |                 case 'image/png': | |||
|  |                     $img = @imagecreatefrompng($srcBga); | |||
|  |                     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); | |||
|  | 
 | |||
|  |             //填充画布(背景色)
 | |||
|  |             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)).'.'.$ext; | |||
|  |                 $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; | |||
|  |     } | |||
|  | } |