zoukankan      html  css  js  c++  java
  • 生成小程序菊花码(生成菊花码、更换中间logo、更改图片尺寸,加文字)

    <?php
    /**
     * 获取小程序二维码
     */
    class getMiniQrcode {
    
        public $db = '';
    
        public function __construct() {
            $this->db = mysqli_connect('', '', '', '');
        }
    
        public function index($id = 0) {
            if (!$id) {
                echo 'no input ID';
                return;
            }
            $res = mysqli_query($this->db, "select id,command,device_num from sys_equipment where id=" . $id);
            $res = mysqli_fetch_assoc($res);
            $ARRAY = [];
            $ARRAY[] = $res;
            // 获取token
            $ACCESS_TOKEN = $this->getAccesstoken();
            // 准备进入小程序的参数
            $color = [
                'r' => 0,
                'g' => 0,
                'b' => 0,
            ];
            foreach ($ARRAY as $key => $value) {
                $param = [
                    'path' => "pages/shop/shop?mac=" . $value['command'],
                    'auto_color' => false,
                    'line_color' => $color,
                    'is_hyaline' => false,
                    'width' => 1280,
                ];
                // 请求微信生成二维码接口
                $request_url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=" . $ACCESS_TOKEN;
                $result = $this->httpRequest($request_url, json_encode($param), "POST");
    
                $myPic = 'http://www.yoursite.com/path/to/logo.jpg';
                // 生成圆形自定义图片
                $logo = $this->yuanImg($myPic);
                //二维码与自定义图片结合
                $sharePic = $this->qrcodeWithLogo($result, $logo);
    
                // 准备文件名
                // $filename = date('YmdHis') . md5(time() . mt_rand(10, 99)) . '.png';
                $filename = $value['id'] . '_small.png';
                $filepath = "./" . $filename;
                // 将二进制图片写入文件
                if (@$fp = fopen($filepath, 'w+')) {
                    fwrite($fp, $sharePic);
                    fclose($fp);
                }
                
                if (file_exists($filepath)) {
                    echo 'success';
                    // 这里的background.png为比二维码大的一张白色图片, 多出的空白的地方,用来写文字
                    $background = imagecreatefrompng('http://www.yoursite.com/path/to/background.png');
                    $img = imagecreatefrompng('./' . $filename);
                    // 合并
                    imagecopy($background, $img, 0, 0, 0, 0, 1280, 1280);
                    // 字体文件包
                    $font = './font.ttf';
                    $color = imagecolorallocate($background, 0, 0, 0);
                    // 要写入的文本
                    $text = 'SN: ' . $value['device_num'];
                    imagettftext($background, 60, 0, 170, 1350, $color, $font, $text);
    
                    //生成图像
                    imagepng($background);
                    imagepng($background, './' . $value['id'] . '.png');
                }
            }
        }
        
        /**
         * [获取AccessToken]
         * @return [type] [description]
         */
        public function getAccesstoken() {
            header('content-type:text/html;charset=utf-8');
            //配置APPID、APPSECRET
            $APPID = '';
            $APPSECRET = '';
            // 请求地址
            $getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$APPID&secret=$APPSECRET";
    
            $ACCESS_TOKEN = "";
    
            $jsonResult = $this->httpRequest($getTokenUrl);
            $jsonResult = json_decode($jsonResult, true);
    
            $ACCESS_TOKEN = $jsonResult["access_token"];
            return $ACCESS_TOKEN;
        }
        /**
         * 剪切图片为圆形
         * @param  $picture 图片数据流 比如file_get_contents(imageurl)返回的东东
         * @return 图片数据流
         */
        public function yuanImg($picture) {
            $src_img = imagecreatefromstring(file_get_contents($picture));
            $w = imagesx($src_img);
            $h = imagesy($src_img);
            $w = min($w, $h);
            $h = $w;
            $img = imagecreatetruecolor($w, $h);
            //这一句一定要有
            imagesavealpha($img, true);
            //拾取一个完全透明的颜色,最后一个参数127为全透明
            $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
            imagefill($img, 0, 0, $bg);
            $r = $w / 2; //圆半径
            $y_x = $r; //圆心X坐标
            $y_y = $r; //圆心Y坐标
            for ($x = 0; $x < $w; $x++) {
                for ($y = 0; $y < $h; $y++) {
                    $rgbColor = imagecolorat($src_img, $x, $y);
                    if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                }
            }
            /**
             * 如果想要直接输出图片,应该先设header。header("Content-Type: image/png; charset=utf-8");
             * 并且去掉缓存区函数
             */
            //获取输出缓存,否则imagepng会把图片输出到浏览器
            ob_start();
            imagepng($img);
            imagedestroy($img);
            $contents = ob_get_contents();
            ob_end_clean();
            return $contents;
        }
    
        /**
         * 在二维码的中间区域镶嵌图片
         * @param $QR 二维码数据流。比如file_get_contents(imageurl)返回的东东,或者微信给返回的东东
         * @param $logo 中间显示图片的数据流。比如file_get_contents(imageurl)返回的东东
         * @return  返回图片数据流
         */
        public function qrcodeWithLogo($QR, $logo) {
            $QR = imagecreatefromstring($QR);
            $logo = imagecreatefromstring($logo);
            $QR_width = imagesx($QR); //二维码图片宽度
            $QR_height = imagesy($QR); //二维码图片高度
            $logo_width = imagesx($logo); //logo图片宽度
            $logo_height = imagesy($logo); //logo图片高度
            $logo_qr_width = $QR_width / 2.2; //组合之后logo的宽度(占二维码的1/2.2)
            $scale = $logo_width / $logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
            $logo_qr_height = $logo_height / $scale; //组合之后logo的高度
            $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
            /**
             * 重新组合图片并调整大小
             * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
             */
            imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
            /**
             * 如果想要直接输出图片,应该先设header。header("Content-Type: image/png; charset=utf-8");
             * 并且去掉缓存区函数
             */
            //获取输出缓存,否则imagepng会把图片输出到浏览器
            ob_start();
            imagepng($QR);
            imagedestroy($QR);
            imagedestroy($logo);
            $contents = ob_get_contents();
            ob_end_clean();
            return $contents;
        }
    
        /**
         * curl 请求
         * @param  [type] $url    [请求地址]
         * @param  string $data   [参数]
         * @param  string $method [请求方式]
         * @return [type]         [description]
         */
        public function httpRequest($url, $data = '', $method = 'GET') {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
            if ($method == 'POST') {
                curl_setopt($curl, CURLOPT_POST, 1);
                if ($data != '') {
                    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                }
            }
    
            curl_setopt($curl, CURLOPT_TIMEOUT, 30);
            curl_setopt($curl, CURLOPT_HEADER, 0);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $result = curl_exec($curl);
            curl_close($curl);
            return $result;
        }
    }
    date_default_timezone_set('PRC');
    $a = new getMiniQrcode();
    $id = $_GET['id'];
    $a->index($id);                            

    访问该PHP文件  传入 ?id=...

    1

  • 相关阅读:
    ES6(二)解构赋值详解
    面试题
    说出x的结果,并解释为什么?
    23种设计模式
    自定义滚动条
    JavaScript之数据类型
    [[转]CSS浮动原理
    正选反选JS
    让2个并列的div根据内容自动保持同等高度js
    jquery鼠标滑过展示图片时显示详情
  • 原文地址:https://www.cnblogs.com/Skate0rDie/p/11578920.html
Copyright © 2011-2022 走看看