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;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |