精华内容
下载资源
问答
  • html5+jquery.qrcode前端生成二维码海报 废话不多说直接上代码 需要使用的JS插件 <script src="js/jquery-2.1.1.min.js"></script> <script src="js/jquery.qrcode.min.js"></script>
  • 微信二维码海报推广示例

    千次阅读 2017-04-13 10:43:47
    为了统计通过扫推广海报进行关注的粉丝数

    这俩天根据客户 需求  微信商城 能生成自己的二维码 并且 需先关注公众号,扫码的用户显示出自己的上级

    研究两天,发现微信二维码接口能实现这个功能 !
    思路:1.生成微信永久二位码 具体看微信公众文档
        http://mp.weixin.qq.com/wiki/18/167e7d94df85d8389df6c94a7a8f78ba.html
          2.获取生成的二维码 创建缩略图  


        3.将二维码缩略图 放到海报上面(微信小头像 也是这个思路)


        4.将生成好图片 上传到微信素材 具体见微信文档


          http://mp.weixin.qq.com/wiki/15/2d353966323806a202cd2deaafe8e557.html


        5将返回的media_id 通过Xml发送给用户
    这样一个生成海报的的示例完成了 下面为部分代码


    /* 
        @$poster_path  海报路径
        @$openid       当前用户openid
        @$qrcode_path  生成的目录
       */
      public function  Create_img($poster_path,$qrcode_path="./qrcode_temp/",$openid){
        if($openid){
            $this->Check_dir($poster_path);
            $qrcode=@file_get_contents($qrcode_path.$openid.".jpg");
            if(!$qrcode){
                $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->getAccessToken();
                $data = [
                    'action_name' => 'QR_LIMIT_STR_SCENE',
                    'action_info' => [
                        'scene' => ['scene_str' => 'invite_'.$openid],
                    ],
                ];
                //通过curl post请求
                $result = $this->curlPost($url,json_encode($data));
                $url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.urlencode($result->ticket);
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_URL, $url);
                ob_start();
                curl_exec($ch);
                $qr_content = ob_get_contents();
                header('Content-type: image/jpg');
                ob_end_clean();
               //缩放二维码大小为需要的大小,并将二维码加入到海报中
                $thumb = imagecreatetruecolor(200, 200);
                
                //获取源文件资源句柄。接收参数为图片流,返回句柄
                $source = imagecreatefromstring($qr_content);
                //将源文件剪切全部域并缩小放到目标图片上,前两个为资源句柄
                imagecopyresampled($thumb, $source, 0, 0, 0, 0, 200, 200, 430, 430);
                //创建图片的实例,接收参数为图片
                $dst_qr = @imagecreatefromstring(file_get_contents($poster_path));
                //加水印
                imagecopy($dst_qr,$thumb, 320, 50, 0, 0, 200, 200);
                //销毁
                imagedestroy($thumb);
                    
                ob_start();//启用输出缓存,暂时将要输出的内容缓存起来
                imagejpeg($dst_qr,$qrcode_path.$openid.".jpg",90);//输出
                $poster = ob_get_contents();//获取刚才获取的缓存
                ob_end_clean();//清空缓存
                imagedestroy($dst_qr);
                $post_data['media'] = '@'.$qrcode_path.$openid.".jpg";
                 $result=$this->uploadMedia($this->getAccessToken(),"image",$post_data);
                if($result) {
                   $media_id=$result->media_id;
                }
            }else{
                $post_data['media'] = '@'.$qrcode_path.$openid.".jpg";
                $result=$this->uploadMedia($this->getAccessToken(),"image",$post_data);
                if($result) {
                   $media_id=$result->media_id;
                }
            }
            return  $media_id;
        }
      }
    //上传到微信临时素材方法
      public function uploadMedia($accessToken,$type='image',$mediaArr){
       $url="http://api.weixin.qq.com/cgi-bin/media/upload?access_token=".$accessToken."&type=".$type;
       $doPost=$this->curlPost($url,$mediaArr);
       return $doPost;
      }
    //注意php5.5 curl上传需 new \CURLFile类



    展开全文
  • php 生成二维码以及制作海报

    千次阅读 2019-04-01 10:15:47
    引用phpqrcode.php生成二维码; public function getcode(){ //默认底图和logo $path = "./images/share/";//路径 if (!is_dir($path)) { load()->func('file'); m...

    引用phpqrcode.php生成二维码;
     

      public function getcode(){
    
    
            //默认底图和logo
    
            $path = "./images/share/";//路径
    
            if (!is_dir($path)) {
    
                load()->func('file');
    
                mkdirs($path);
    
            }
    
            $file = $path . 'code.png';
    
            //生成二维码
            $value = 'http://www.baidu.com/'; //二维码内容   
            $errorCorrectionLevel = 'L';//容错级别   
            $matrixPointSize = 6;//生成图片大小   
            //生成二维码图片   
            QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2);   
            $logo = './images/ditu/logo.jpg';//准备好的logo图片   
            $QR = 'qrcode.png';//已经生成的原始二维码图   
    
            if ($logo !== FALSE) {
                $QR = imagecreatefromstring(file_get_contents($QR));   
                $logo = imagecreatefromstring(file_get_contents($logo));   
                $QR_width = imagesx($QR);//二维码图片宽度   
                $QR_height = imagesy($QR);//二维码图片高度   
                $logo_width = imagesx($logo);//logo图片宽度   
                $logo_height = imagesy($logo);//logo图片高度   
                $logo_qr_width = $QR_width / 5;   
                $scale = $logo_width/$logo_qr_width;   
                $logo_qr_height = $logo_height/$scale;   
                $from_width = ($QR_width - $logo_qr_width) / 2;   
                //重新组合图片并调整大小   
                imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,   
                $logo_qr_height, $logo_width, $logo_height);   
            }   
            //输出图片   
            imagepng($QR, $file);
            //生成二维码 end
            $config = array(
              'image'=>array(
                array(
                  'url'=>$file,     //二维码资源
                  'stream'=>0,
                  'left'=>116,
                  'top'=>-216,
                  'right'=>0,
                  'bottom'=>0,
                  'width'=>178,
                  'height'=>178,
                  'opacity'=>100
                )
              )
            );
    
            $file2 = $path . time() . '.png';
    
            //如果要看报什么错,可以先注释调这个header
              $imageDefault = array(
                'left'=>0,
                'top'=>0,
                'right'=>0,
                'bottom'=>0,
                'width'=>100,
                'height'=>100,
                'opacity'=>100
              );
              $textDefault = array(
                'text'=>'',
                'left'=>0,
                'top'=>0,
                'fontSize'=>32,       //字号
                'fontColor'=>'255,255,255', //字体颜色
                'angle'=>0,
              );
              $background = './images/ditu/wx_hb.jpg';//海报最底层得背景
              //背景方法
              $backgroundInfo = getimagesize($background);
              $backgroundFun = 'imagecreatefrom'.image_type_to_extension($backgroundInfo[2], false);
              $background = $backgroundFun($background);
              $backgroundWidth = imagesx($background);  //背景宽度
              $backgroundHeight = imagesy($background);  //背景高度
              $imageRes = imageCreatetruecolor($backgroundWidth,$backgroundHeight);
              $color = imagecolorallocate($imageRes, 0, 0, 0);
              imagefill($imageRes, 0, 0, $color);
              // imageColorTransparent($imageRes, $color);  //颜色透明
              imagecopyresampled($imageRes,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background));
              //处理了图片
              if(!empty($config['image'])){
                foreach ($config['image'] as $key => $val) {
                  $val = array_merge($imageDefault,$val);
                  $info = getimagesize($val['url']);
                  $function = 'imagecreatefrom'.image_type_to_extension($info[2], false);
                  if($val['stream']){   //如果传的是字符串图像流
                    $info = getimagesizefromstring($val['url']);
                    $function = 'imagecreatefromstring';
                  }
                  $res = $function($val['url']);
                  $resWidth = $info[0];
                  $resHeight = $info[1];
                  //建立画板 ,缩放图片至指定尺寸
                  $canvas=imagecreatetruecolor($val['width'], $val['height']);
                  imagefill($canvas, 0, 0, $color);
                  //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
                  imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'],$resWidth,$resHeight);
                  $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']) - $val['width']:$val['left'];
                  $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']) - $val['height']:$val['top'];
                  //放置图像
                  imagecopymerge($imageRes,$canvas, $val['left'],$val['top'],$val['right'],$val['bottom'],$val['width'],$val['height'],$val['opacity']);//左,上,右,下,宽度,高度,透明度
                }
              }
              //处理文字
              if(!empty($config['text'])){
                foreach ($config['text'] as $key => $val) {
                  $val = array_merge($textDefault,$val);
                  list($R,$G,$B) = explode(',', $val['fontColor']);
                  $fontColor = imagecolorallocate($imageRes, $R, $G, $B);
                  $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']):$val['left'];
                  $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']):$val['top'];
                  imagettftext($imageRes,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,$val['fontPath'],$val['text']);
                }
              }
              //生成图片
              if(!empty($file2)){
                $res = imagejpeg ($imageRes,$file2,90); //保存到本地
                imagedestroy($imageRes);
                var_dump($file2);die;
                if(!$res) return false;
                return $file2;
              }else{
                imagejpeg ($imageRes);     //在浏览器上显示
                imagedestroy($imageRes);
              }
            }
    
        }

    https://www.jb51.net/article/136425.htm  原文

    展开全文
  • 页面 代码 <?php namespace app\index\controller; use think\Controller; class Brcode extends Controller { /** ... * $_FILES ['posters'] 海报底图 * $_FILES ['url'] excel表格

    前端页面

    前端代码

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>海报生成</title>
        <style>
            html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
                margin: 0;
                padding: 0;
                border: 0;
                font-size: 100%;
                font: inherit;
                vertical-align: baseline
            }
    
            article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
                display: block
            }
    
            body {
                line-height: 1
            }
    
            ol, ul {
                list-style: none
            }
    
            blockquote, q {
                quotes: none
            }
    
            blockquote:before, blockquote:after, q:before, q:after {
                content: '';
                content: none
            }
    
            table {
                border-collapse: collapse;
                border-spacing: 0
            }
    
        </style>
    
        <style>
            * {
                box-sizing: border-box;
            }
    
            body {
                font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
                color: white;
                font-size: 12px;
                background: #333333;
            }
    
            form {
                background: #111;
                width: 500px;
                margin: 50px auto;
                border-radius: 0.4em;
                border: 1px solid #191919;
                overflow: hidden;
                position: relative;
                box-shadow: 0 5px 10px 5px rgba(0, 0, 0, 0.2);
            }
    
            form:after {
                content: "";
                display: block;
                position: absolute;
                height: 1px;
                width: 100px;
                left: 20%;
                background: linear-gradient(to right, #111111, #444444, #b6b6b8, #444444, #111111);
                top: 0;
            }
    
            form:before {
                content: "";
                display: block;
                position: absolute;
                width: 8px;
                height: 5px;
                border-radius: 50%;
                left: 34%;
                top: -7px;
                box-shadow: 0 0 6px 4px #fff;
            }
    
            .inset {
                padding: 20px;
                border-top: 1px solid #19191a;
            }
    
            form h1 {
                font-size: 18px;
                text-shadow: 0 1px 0 black;
                text-align: center;
                padding: 15px 0;
                border-bottom: 1px solid black;
                position: relative;
            }
    
            form h1:after {
                content: "";
                display: block;
                width: 250px;
                height: 100px;
                position: absolute;
                top: 0;
                left: 50px;
                pointer-events: none;
                transform: rotate(70deg);
                background: linear-gradient(50deg, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0));
            }
    
            label {
                color: #666;
                display: block;
                padding-bottom: 9px;
            }
    
            input[type=text],
            input[type=password] {
                width: 100%;
                padding: 8px 5px;
                background: linear-gradient(#1f2124, #27292c);
                border: 1px solid #222;
                box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1);
                border-radius: 0.3em;
                margin-bottom: 20px;
            }
    
            label[for=remember] {
                color: white;
                display: inline-block;
                padding-bottom: 0;
                padding-top: 5px;
            }
    
            input[type=checkbox] {
                display: inline-block;
                vertical-align: top;
            }
    
            .p-container {
                padding: 0 20px 20px 20px;
            }
    
            .p-container:after {
                clear: both;
                display: table;
                content: "";
            }
    
            input[type=submit] {
                padding: 5px 20px;
                border: 1px solid rgba(0, 0, 0, 0.4);
                text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4);
                box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), inset 0 10px 10px rgba(255, 255, 255, 0.1);
                border-radius: 0.3em;
                background: #0184ff;
                color: white;
                display: block;
                margin: 0 auto;
                /*float: right;*/
                font-weight: bold;
                cursor: pointer;
                font-size: 13px;
            }
    
            .button {
                padding: 5px 20px;
                border: 1px solid rgba(0, 0, 0, 0.4);
                text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4);
                box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), inset 0 10px 10px rgba(255, 255, 255, 0.1);
                border-radius: 0.3em;
                background: #0184ff;
                color: white;
                display: block;
                margin: 0 auto;
                /*float: right;*/
                font-weight: bold;
                cursor: pointer;
                font-size: 13px;
            }
    
            input[type=submit]:hover {
                box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), inset 0 -10px 10px rgba(255, 255, 255, 0.1);
            }
    
            input[type=text]:hover,
            input[type=password]:hover,
            label:hover ~ input[type=text],
            label:hover ~ input[type=password] {
                background: #27292c;
            }
    
        </style>
    
    </head>
    
    <body>
    
    <form method="post" action="/index/index/toImportTheUrl" enctype="multipart/form-data">
        <h1>海报生成</h1>
        <div class="inset">
            <p>
                <label style="color: red;">LOGO图</label>
                <input type="file" name="logo"/>
            </p>
            <br>
            <p>
                <label style="color: red;">海报底图</label>
                <input type="file" name="posters"/>
            </p>
            <br>
            <p>
                <label style="color: red;">表格上传</label>
                <input type="file" name="url"/>
            </p>
            <br>
            <p>
                <label style="color: red;">上传人</label>
                <input type="text" name="name" placeholder="lys"/>
            </p>
            <p>
                <label style="color: red;">生成日期</label>
                <input type="text" name="date" placeholder="0522"/>
            </p>
            <p>
                <label style="color: red;">起始序号</label>
                <input type="text" name="sequence" placeholder="1001"/>
            </p>
        </div>
        <p class="p-container">
            <input id="btn1" type="submit" onclick="threeFn()" value="提交">
        </p>
    </form>
    </body>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script>
        function threeFn(){
            $("#btn1").attr("style","display:none;");
        }
    </script>
    
    </html>

     

    PHP代码

    <?php
    
    namespace app\index\controller;
    
    use think\Controller;
    
    class Index extends Controller
    {
        public function index()
        {
            return view('index');
        }
    
        /**
         * $date 生成日期
         * $sequence 起始序号
         * $_FILES ['logo'] LOGO图
         * $_FILES ['posters'] 海报底图
         * $_FILES ['url'] excel表格
         */
        public function toImportTheUrl()
        {
            $name = $this->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 "<script> alert('下载压缩包'); </script>";
            echo "<meta http-equiv='Refresh' content='0;URL=$url'>";
    
            $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;
        }
    
    
    }
    

     

    展开全文
  • 文章目录前言一、描述二、逻辑代码三、获取二维码...海报制作的所有博客和一些问题: 文字换行算法详解,传送门: 头像切割成圆形方法详解,传送门: 获取微信二维码详情,传送门: java BufferedImage 转 InputStrea

    前言

    1. 文字换行算法详解,传送门:java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
    2. 头像切割成圆形方法详解,传送门:java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
    3. 获取微信二维码详情,传送门:java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上
    4. java BufferedImage 转 InputStreampng 图片合成到模板(另一个图片)上时,透明部分变成了黑色,传送门:java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
    5. java 整合echarts 画出 折线图,传送门:
    6. Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题,传送门:java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
    7. 项目部署到linux下中文不显示,echarts图上的中文也不显示问题,传送门:java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
    • 本次博客主要是 稍微说一下获取微信二维码详情,这里的代码都在 Main_CreatePosterAndEchart.java

    一、描述

    这里需要获取微信小程序二维码,放到海报的左下角,其实获取二维码的过程,看微信开发文档即可。

    微信开发文档-获取微信二维码

    二、逻辑代码

    // 画 二维码 并改变大小
    // 1. 先 获取二维码(二维码携带一个参数)
    InputStream erWeiMa = getErWeiMa(1);
    // 2. 初始化并的改变大小
    BufferedImage logoImg = PosterUtil.drawInitAndChangeSize(null, erWeiMa, 130, 130);
    // 将二维码保存到本地
    PosterUtil.save(logoImg, "png", "d:\\test.png");
    // 3. 画二维码
    PosterUtil.drawImage(bufferedImage, logoImg, 532, 1108);
    

    三、获取二维码代码

    id 是放到二维码里的参数。返回 输入流。

        /**
         * @return java.io.InputStream
         * @Author fengfanli
         * @Description //TODO 从微信平台 获取小程序二维码
         * @Date 16:53 2021/4/1
         * @Param []
         **/
        public static InputStream getErWeiMa(Integer id) {
            // 获取二维码:1、先获取access_token 2、在获取 二维码
            String appId = PropertiesFileUtil.getInstance("app").get("wx.app.ip");
            String appSecret = PropertiesFileUtil.getInstance("app").get("wx.app.secret");
            System.out.println("appId==" + appId + ";appSecret==" + appSecret);
            // 获取 access_token
            String getUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
            System.out.println("getUrl==" + getUrl);
            String str = HttpUtil.sendGet(getUrl);
            JSONObject json = (JSONObject) JSONObject.parse(str);
            String access_token = (String) json.get("access_token");
            System.out.println("access_token:" + access_token);
            // 获取 二维码图片流
            String postURL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + access_token;
            System.out.println("postURL==" + postURL);
            JSONObject jsonObject = new JSONObject();
            // 这里往二维码里放入前端传过来的 id,前端获取之后,根据id 去获取详情
            jsonObject.put("scene", id);
            String scene = JSONObject.toJSONString(jsonObject);
            InputStream inputStream = null;
            inputStream = HttpUtil.sendPostForErWeiMa(postURL, scene);
            return inputStream;
        }
    

    四、将二维码画(合成)到模板上

    1. 描述

    这个方法在PosterUtil上
    先初始化,在改变大小,

    2. 初始化代码和改变大小 代码

        /**
         * @return java.awt.image.BufferedImage
         * @Author fengfanli
         * @Description //TODO 初始化模板并改变宽度和高度
         * @Date 9:56 2021/3/30
         * @Param [path, width, height]
         **/
        public static BufferedImage drawInitAndChangeSize(String path, InputStream inputStream, int width, int height) throws Exception {
            BufferedImage canvas = null;
            if (path != null) {
                URL url = new URL(path);
                canvas = ImageIO.read(url);
            }
            if (inputStream != null) {
                canvas = ImageIO.read(inputStream);
            }
            canvas = changeSize(canvas, width, height);
            return canvas;
        }
    
    
        /**
         * @return java.awt.image.BufferedImage
         * @Author fengfanli
         * @Description // TODO 改变宽度和高度:先画一个空白的图,再将需要改变大小的图 画上去,再限制大小
         * @Date 9:56 2021/3/30
         * @Param [originalImage, width, height]
         **/
        public static BufferedImage changeSize(BufferedImage originalImage, int width, int height) {
            // 抗锯齿
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  // originalImage.getType() 改为 BufferedImage.TYPE_INT_RGB
            Graphics2D g2d = image.createGraphics();
            image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.OPAQUE);
            g2d = image.createGraphics();
            g2d.drawImage(originalImage, 0, 0, width, height, null);
            g2d.dispose();
            return image;
        }
    

    3. 合成图 代码

        /**
         * @return java.awt.image.BufferedImage
         * @Author fengfanli
         * @Description //TODO 在背景模板上放置 image
         * @Date 9:57 2021/3/30
         * @Param [canvas, logo, logoX, logoY]
         **/
        public static void drawImage(BufferedImage canvas, BufferedImage logo, int logoX, int logoY) {
            Graphics2D g2d = canvas.createGraphics();
            //g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1));
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.drawImage(logo, logoX, logoY, null);
            g2d.dispose();
        }
    
    展开全文
  • 接下来,我会把纯前端实现生成带二维码海报全流程给大家讲个明明白白,把我自己遇到的坑,给大家详细分享并讲解,防止大家遇到相似问题,即使遇到问题,也会有一个明确的方向,并且吐血建议大家收藏一波,以备...
  • //生成带二维码海报 function poster(){ $url='http://www.baidu.com';//网址 $avatarUrl= '/img/1.png';//生成后的二维码 $img='/img/1.jpg';//海报的背景图片 $f_file_name = "/img/last.png";//生成后的...
  • vue2.0 海报生成器、二维码生成器

    千次阅读 2019-05-21 17:42:02
    前端生成附带二维码海报,可保存分享,及图片在canvas中的跨域问题
  • 这几天接到一个需求,需要将一个邀请链接转换为一个带有二维码能够分享出去的海报图,网上找了很多的方法,也踩了不少的坑,希望大家遇到类似的需求能够少走弯路。。 先来一张效果图吧: 首先我采用了qrcode的插件...
  • H5二维码海报生成保存相关问题记录 最近在开发H5页面中遇到二维码生成保存并下载到系统相册中的问题。问题大致分为:生成海报不全,未按照H5页面的显示进行海报保存,图片模糊等相关问题。 使用技术:qrcode + ...
  • 实现原理: 利用微信小程序canvas API把文字和图片进行合成,用wx.canvasToTempFilePath()返回图片地址再保存至相册。
  • 近来有许多商家反映想生成一张带有自己专属二维码海报,像地铁车厢里经常有看到明星海报上有带二维码来吸引粉比关注公众号的这种方式,今天我就告诉大家其实很简单。首先你需要在微信公众平台申请一个服务号并且...
  • 想必很多微信公众号开发的,会有一项功能就是微信的海报宣传,就是把你的推广二维码跟宣传海报一起生成,然后显示在微信栏中,就比如这个功能一样。如果是专职做微信开发的话,那肯定是小事一桩,但是我都没有接触过...
  • 如何将二维码巧妙放进海报里?

    千次阅读 2020-12-24 11:46:13
    设计作为仅次于码农令人第二头秃的...不知道大家伙有哪些想法,我在此班门弄斧下,叨叨几句关于二维码海报设计自己的看法,欢迎留言交流。 大家在做活动海报的时候或许经历过这样一种痛:二维码不知道放在哪里好看?...
  • 有人通过制作个性二维码致富,今天社长凯先生就要对不住啦(不是抢饭碗,是打破饭碗~)公开这种赚钱方法的所有具体操作方法~手把手教你(嘴对嘴超超超...详细教学~) 图中各种个性二维码制作,其实方法非常简单...
  • 由于最近需要做一个线上活动,所以策划了一个微信二维码海报的用户裂变方案。做好了需求以后交给我们可爱的程序媛妹妹。三天过后去问她,她的表情是这样的她是不是在说,“啊啊,真是不好意思”然后给了我一个我竟...
  • 最近项目涉及到绘制二维码,所以写了个小方法,帮助大家快速生成二维码。 引用:ThoughtWorks.QRCode.dll /// <summary> /// 画一个二维码(可带图标) /// </summary> /// <param name=...
  • 我们的日常工作中少不了文件传输,不得不花上大量时间在QQ、微信、邮箱等社交通讯上来回切换,找文件、发文件、发文件、找文件… ...使用文件二维码,从此你不必再困扰于同时给多人发文件的繁琐流程,再
  • 要将邀请链接做成一个二维码,并放到一个海报背景上 分享邀请海报给被邀请人,扫描二维码注册 需求比较明确,这篇文章就来说下需求里面的第二步是如何实现的以及实现过程中需要注意的一些问题。 如何生成二维码 ...
  • 随处可见的QR Code 出现在各种海报,车票,个人名片、产品、衣服,网站上,由于二维码的发展,网络上也就应运而生了许多二维码在线生成网站以及二维码生成软件,今天大眼仔就给大家分享比较好用的二维码制作软件。...
  • 微信小程序生成海报

    2018-04-28 11:56:07
    用于微信小程序生成海报,可调节图片大小,内容自定义,位置等属性,打开即用
  • 海报背景图(建议放在不要放在本地)、 ②头像(需要授权)、 ③带参二维码、 ④需要自定义展示的文字、小的icon图片 2、工具类,及方法 ①兼容屏幕大小的rpx转px的方法(手机屏幕有差异,canvas用的是px为单位) ...
  • 背景:需求是在web端生成一张带有二维码的分享海报,用户可以将海报图片保存到本地。 实现思路: 使用qrcode生成二维码图片,再使用canvas将二维码海报背景合成一张图片; 直接看代码 ???? // 按钮 <button v...
  • python二维码生成带logo

    2015-07-01 14:22:44
    python二维码生成带logo import qrcode qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data('Some data') qr.make(fit=True) ...
  • 使用python,使用pillow库、qrcode库自动处理图片并添加二维码处理的小思路,并加入进度条可视化
  • java生成推广二维码

    2016-01-14 11:47:09
    全网唯一全面美化二维码代码源码,自己纯手工制作。 具体功能:图片和图片组合,图片添加推广文字。 成品类似0元购推广二维码。可添加文字,可组合图片。
  • 最近参加了老男孩的一个python训练营,里面某项任务是要求在某个海报模板上批量添加姓名和二维码,生成类似下图的海报。 图中我用红色方框标记的是需要修改的地方,先来聊下自己的思路: 1.要进行图片操作,要用到...
  • 有时候我们看到一张海报很漂亮,可惜的是上面有别人的二维码。想换成自己的微信/抖音二维码,那么该怎么做呢? 这个可以制作的工具是非常的多,P图、美图 都有。这个都是需要一点点的基本功。如果是小白的话推荐 ...
  • 公众号开发精品教程(4)——生成带参数的二维码及合成海报 公众号开发精品教程(5)——获取用户基本信息与网页授权 整个项目的源码已经上传到百度网盘(博主的Git在维护,就不拿出来丢人了),永久有效,免费,在...
  • 前端生成二维码并保存 1.前端生成二维码并保存 1.下载weapp.qrcode.js文件并引入项目中 2.先在wxml文件中构建canvas画布 <canvas style="width: 200px; height: 200px;" canvas-id="myQrcode"></canvas>...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,474
精华内容 589
关键字:

二维码海报制作