批量生成带有二维码(含logo)的分享海报

前端页面

批量生成带有二维码(含logo)的分享海报_第1张图片

前端代码




    
    海报生成
    
 
    
 

 

 

海报生成




 PHP代码

request->request('name');
        $date = $this->request->request('date');
        $sequence = $this->request->request('sequence');
        if (empty ($_FILES ['logo'] ['name']) || empty ($_FILES ['posters'] ['name']) || empty ($_FILES ['url'] ['name']) || empty($name) || empty($date) || empty($sequence)) {
            $this->error('数据不可为空');
        }
        // 存储logo图
        if (!empty ($_FILES ['logo'] ['name'])) { // 判断文件是否为空
            $logo_file = $_FILES ['logo'] ['tmp_name'];
            // 重设置文件名
            // $logofilename = 'logo' . substr($_FILES ['logo'] ['name'], stripos($_FILES ['logo'] ['name'], '.'));
            $logofilename = 'logo.png';
            $logopath = 'img/' . $logofilename; // 设置移动路径
            move_uploaded_file($logo_file, $logopath);
        }
        // 存储海报底图
        if (!empty ($_FILES ['posters'] ['name'])) { // 判断文件是否为空
            $posters_file = $_FILES ['posters'] ['tmp_name'];
            // 重设置文件名
            // $postersfilename = 'canvas' . substr($_FILES ['posters'] ['name'], stripos($_FILES ['posters'] ['name'], '.'));
            $postersfilename = 'canvas.png';
            $posterspath = 'img/' . $postersfilename; // 设置移动路径
            move_uploaded_file($posters_file, $posterspath);
        }
 
 
        if (!empty ($_FILES ['url'] ['name'])) { // 判断文件是否为空
            $tmp_file = $_FILES ['url'] ['tmp_name'];
            // 判断文件类型
            $file_types = explode(".", $_FILES ['url'] ['name']);
            $file_type = $file_types [count($file_types) - 1];
            // 判别是不是.xls文件,判别是不是excel文件
            if (strtolower($file_type) != "xls" && strtolower($file_type) != "xlsx" && strtolower($file_type) != "csv") {
                $this->error('不是Excel文件,重新上传', '/index/index/index');
            }
            // 重设置文件名
            $filename = time() . substr($_FILES ['url'] ['name'], stripos($_FILES ['url'] ['name'], '.'));
            $path = 'excel/' . $filename; // 设置移动路径
 
            move_uploaded_file($tmp_file, $path);
 
            if ($file_type == 'xls') {
                $type = 'Excel5'; // 后缀如果是 xls 的话用E xcel5 是 xlsx 用 Excel2007
            } elseif ($file_type == 'xlsx') {
                $type = 'Excel2007'; // 后缀如果是 xls 的话用E xcel5 是 xlsx 用 Excel2007
            } elseif ($file_type == 'csv') {
                $type = 'CSV';
            }
 
            $xlsReader = \PHPExcel_IOFactory::createReader($type);
            $xlsReader->setReadDataOnly(true);
            $xlsReader->setLoadSheetsOnly(true);
            $Sheets = $xlsReader->load($path);
            // 开始读取上传到服务器中的Excel文件,返回一个二维数组
            $dataArray = $Sheets->getSheet(0)->toArray();
            unset($dataArray['0']);
            foreach ($dataArray as $k => $v) {
                $dataArray[$k] = $v['3'];
            }
            // 调用方法生成海报
            $fileList = $this->generatePoster($dataArray, $sequence, $name, $date);
            // 删除二维码
            @unlink('Qr_code.png');
            // 删除Logo二维码
            @unlink('Logo_qr_code.png');
 
            /*****   多文件压缩开始   *****/
            // 生成的压缩包所在的位置路径
            $filename = "alg/" . $name . '-' . $date . ".zip";
            // 声明ZipArchive类
            $zip = new \ZipArchive();
            // 打开压缩包,没有则创建
            $zip->open($filename, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
            foreach ($fileList as $file) {
                // 向压缩包中添加文件
                $zip->addFile($file, basename($file));
            }
            // 关闭压缩包
            $zip->close();
            /*****   多文件压缩结束   *****/
 
            // 删除上传的文件
            @unlink($_SERVER['DOCUMENT_ROOT'] . '/' . pathinfo($path)['dirname'] . '/' . pathinfo($path)['basename']);
        }
 
        // 设置需要删除的文件夹
        $path = $_SERVER['DOCUMENT_ROOT'] . '/' . pathinfo('poster/' . $date)['dirname'] . '/' . pathinfo('poster/' . $date)['basename'];
        // 删除文件夹及子文件
        if (is_dir($path)) {
            // 遍历一个文件夹所有文件并返回数组
            $poster_arr = scandir($path);
            foreach ($poster_arr as $val) {
                //排除目录中的.和..
                if ($val != "." && $val != "..") {
                    //如果是目录则递归子目录,继续操作
                    if (is_dir($path . '/' . $val)) {
                        //子目录中操作删除文件夹和文件
                        deldir($path . '/' . $val . '/');
                        //目录清空后删除空文件夹
                        @rmdir($path . '/' . $val . '/');
                    } else {
                        //如果是文件直接删除
                        unlink($path . '/' . $val);
                    }
                }
            }
            @rmdir($path);
        }
        $url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . '/' . $filename;
 
        echo "";
        echo "";
 
        $this->success('海报生成完毕,正在下载!', 'index/index/index');
    }
 
    /**
     * 生成二维码 Logo二维码 带Logo二维码海报
     * $url 二维码内容
     * $sequence // 起始序号
     * $name // 上传人
     * $date // 日期
     */
    public function generatePoster($url, $sequence, $name, $date)
    {
        header("Content-type: image/png");
        // 加载phpqrcode类文件
        include('phpqrcode/phpqrcode.php');
        // 声明qrcode类
        $qrcode = new \QRcode();
 
        $arr = [];
 
        foreach ($url as $value) {
 
            /*****   二维码生成开始   *****/
            // 二维码内容
            // $value = $url;
            // 容错级别
            $errorCorrectionLevel = 'H';
            // 生成二维码大小
            $matrixPointSize = 11;
            // 生成二维码图片名(含路径)
            $filename = 'Qr_code.png';
            // 生成二维码
            $qrcode->png($value, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
            /*****   二维码生成结束   *****/
 
            /*****   Logo二维码生成开始   *****/
            // 准备好的logo图片
            $logo = 'img/logo.png';
            // logo图是否存在
            if (file_exists($logo)) {
                // 目标图象连接资源
                $QR = imagecreatefromstring(file_get_contents($filename));
                // 源图象连接资源
                $logo = imagecreatefromstring(file_get_contents($logo));
                // 二维码图片宽度
                $QR_width = imagesx($QR);
                // 二维码图片高度
                // $QR_height = imagesy($QR);
                // logo图片宽度
                $logo_width = imagesx($logo);
                // logo图片高度
                $logo_height = imagesy($logo);
                // 组合之后logo的宽度(占二维码的1/5)
                $logo_qr_width = $QR_width / 4;
                // logo的宽度缩放比(本身宽度/组合后的宽度)
                $scale = $logo_width / $logo_qr_width;
                // 组合之后logo的高度
                $logo_qr_height = $logo_height / $scale;
                // 组合之后logo左上角所在坐标点
                $from_width = ($QR_width - $logo_qr_width) / 2;
                // 重新组合图片并调整大小
                // imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
                imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
            }
            // 输出图片 (这里注意是本地目录)
            imagepng($QR, 'Logo_qr_code.png');
            // 销毁一图像
            imagedestroy($QR);
            imagedestroy($logo);
            // 删除二维码
            // @unlink('Qr_code.png');
            /*****   Logo二维码生成结束   *****/
 
            /*****   海报和Logo二维码合成开始   *****/
            // 海报底图路径
            $posters_path = 'img/canvas.png';
            // 覆盖的Logo二维码地址
            $logo_path = 'Logo_qr_code.png';
            //创建图片的实例
            $posters = imagecreatefromstring(file_get_contents($posters_path));
            $logo = imagecreatefromstring(file_get_contents($logo_path));
            // 获取覆盖图图片的宽高
            list($posters_w, $logo_h) = getimagesize($logo_path);
            // 将覆盖图复制到目标图片上,最后个参数100是设置透明度(100是不透明),这里实现不透明效果
            imagecopymerge($posters, $logo, 245, 395, 0, 0, $posters_w, $logo_h, 100);
            // 删除Logo二维码
            // @unlink('Logo_qr_code.png');
            // 判断文件是否存在 不存在则生成
            @mkdir('poster/' . $date);
            // 根据需要生成相应的图片
            imagepng($posters, 'poster/' . $date . '/' . $name . '-' . $date . '-' . $sequence . '.png');
            /*****   海报和Logo二维码合成结束   *****/
            $arr[] = 'poster/' . $date . '/' . $name . '-' . $date . '-' . $sequence . '.png';
            $sequence++;
        }
        return $arr;
    }
 
 
}

你可能感兴趣的:(PHP,#,API,笔记,php)