php实现小程序码自定义中间icon

小程序码生成的时候是默认使用小程序后台设置的小程序icon图片的,但是在有些场景我们可能要替换成我们自己想要的icon。
下面先放代码:

public function makeNewQrCodeAction()
    {
        //获取用户头像并转string
        $avatarUrl = $this->_req->getQuery('avatarUrl', "");
        if (!$avatarUrl) {
            response::err_lack_param();
        }
        $avatar_file = file_get_contents($avatarUrl);
        $logo = $this->changeAvatar($avatar_file);

        //获取小程序码
        $data['scene'] = $this->_req->getQuery('code', 1);
        $data['width'] = (int)$this->_req->getQuery('width', 280);
        $data['auto_color'] = $this->_req->getQuery('auto_color');
        $data['line_color'] = $this->_req->getQuery('line_color');
        $data['is_hyaline'] = $this->_req->getQuery('is_hyaline');
        $data['page'] = $this->_req->getQuery('path');
        $wxModel = new \Hd\WxAuthModel();
        $Qr_code = $wxModel->getShareCode($data);  //生成小程序码接口

        //小程序码与头像进行拼接
        $url = $this->makeOnePic($Qr_code, $logo);
        response::result($url);

    }

    private function  makeOnePic($qr_code, $logo)  //二维码与头像组合
    {
        $qr_code = imagecreatefromstring($qr_code);
        $icon = imagecreatefromstring($logo);

        $qr_width = imagesx($qr_code);  //二维码图片宽度
//        $qr_height = imagesy($qr_code);  //二维码图片高度
        $lg_width = imagesx($icon);  //logo图片宽度
        $lg_height = imagesy($icon);  //logo图片高度

//        var_dump($qr_width,$qr_height);
//        var_dump($lg_width,$lg_height);

        $qr_lg_width = $qr_width / 2.2;
        $scale = $lg_width / $qr_lg_width;
        $qr_lg_height = $lg_height / $scale;

        $start_width = ($qr_width - $lg_width) / 2 + 1;
//        var_dump($scale,$qr_lg_height);
//        var_dump($start_width);
        imagecopyresampled($qr_code, $icon, $start_width, $start_width, 0, 0, $qr_lg_width, $qr_lg_height, $lg_width, $lg_height);

        //传回处理好的图片url
//        $qrcode = "/imgs/qrCode" . time() . ".png";

//        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
//        $tmp_url = $protocol . $_SERVER['HTTP_HOST'] . $qrcode;  //LCT这个需上线后除去
//        response::result($tmp_url);

        imagepng($qr_code); //保存
        imagedestroy($qr_code);
        imagedestroy($icon);
        exit;
    }

    private function changeAvatar($avatar)
    {
       //处理用户头像为圆形icon
        $avatar = imagecreatefromstring($avatar);
        $w = imagesx($avatar);
        $h = imagesy($avatar);
        $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($avatar, $x, $y);

                if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
                    imagesetpixel($img, $x, $y, $rgbColor);
                }
            }
        }

        ob_start();
        imagepng($img);
        imagedestroy($img);
        imagedestroy($avatar);
        $contents = ob_get_contents();  、、读取缓存区的内容
        ob_end_clean();  //清空缓存区

        return $contents;
    }

   public function getShareCode($data)  //生成小程序码
   {
        $access_token = $this->getAccessToken();  //获取access_token这个要设置token缓存,具体可以查看我的另一篇文章
        $res_url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=$access_token";
        header('content-type:image/png');
        $data = json_encode($data);
        $Qr_code = $this->http_request($res_url, $data);
        return $Qr_code;

    }

遇到的困难:

之前将头像图片、处理成圆形头像的图片及最后的组合图都先生成本地图片,然后再处理,这样就多了一个图片存放的问题,在用户很多的时候可能会产生很多不需要的图。

存在的问题:

最后生成的二维码中间的icon可能会出现位置不居中的问题。这个我这边设置大小width大小为280左右的时候就大概能看。应该是算icon图位置的时候没有设好。这个有空要重新来一遍。

原文地址:https://www.cnblogs.com/xinxinmifan/p/10485249.html

时间: 2024-10-07 21:47:13

php实现小程序码自定义中间icon的相关文章

【小程序码 - 设计篇】菊花绽放

作者:lincolnlin,endyxu,changoran 2017 年四月,微信正式推出了小程序码.小程序码的使命及诞生的过程, 扫码背后藏了什么秘密?小程序码又为何长得像菊花? | 你问鹅答一文已经作过一番介绍.本文将为你剖析更多关于小程序码的技术细节. 小程序码的前世 初见小程序码,犹如一朵盛开的菊花. 其实这种脑洞大开的异形码并非微信首创,Facebook.kik.snapchat 等公司都研发了自己体系的码. 从设计的图形上,我们把上述方案简单分成: ? 平面类 如 qrcode ,

生成微信小程序码java实现

@Override public ModelAndView onSubmit(HttpServletRequest req, HttpServletResponse res, WxQrCodeForm cmd, BindException err) throws Exception { SimpleResult<Object> result = SimpleResult.create(false); Locale locale = new Locale("en", &quo

小程序-将页面生成一个小程序码分享出去

这个需求我遇到过2次.一次是在识别二维码后跳转到其它页面,另一次是识别二维码后进入到生成小程序码的当前页面. 我有一个梦想,就是成为一名黑客!!!!!! 小程序中js wx.request({        url: '',        method: 'POST',        data: {        ModuleName: "",    //空间名 接口文档里每个接口会有标明 必填        MethodName: "GetQrCode",   

后台生成带参跳到指定页面的小程序码

方法步骤如下: 1. 获取 access_token 详见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 2. 生成小程序码 接口B:适用于需要的码数量极多的业务场景 0)可接受页面参数较短 1)通过该接口生成的小程序码,永久有效 2)数量不做限制(截止今天,官方未对生成数量做限制) 3)用户扫码后,可以在对应页面获取到二维码中scene字段下面的值 4)B接口调用分钟频率受限(目前5000次/分钟,会调整)

PHP获取小程序码并返回前端显示图片

小程序的二维码分为小程序码和二维码: 生成小程序二维码文档中说后端来生成. 参考 小程序开发文档资料:https://developers.weixin.qq.com/miniprogram/dev/api/getWXACodeUnlimit.html 文档的参数介绍还是蛮详细的,但是没有具体的demo,对于请求的接口的返回值是进制流(也就是在浏览器显示一堆乱码)也是很令人懊恼,这里贴一下我的代码: //获取小程序码,这里调用的是小程序码的A接口类型 public function getQRC

生成指定页面带参数的小程序码及踩坑

//获取accessToken let that = this; const APP_ID = 'yourapp_id';// 小程序appid const APP_SECRET = 'yourapp_secreat';// 小程序app_secret let access_token = ''; wx.request({ url:"https://api.weixin.qq.com/cgi-bin/token", data: { grant_type: 'client_credent

C# 生成小程序码

1 /// <summary> 2 /// B接口-微信小程序带参数二维码的生成 3 /// </summary> 4 /// <param name="access_token"></param> 5 /// <returns></returns> 6 public static string CreateWxCode(string access_token string roomId) 7 { 8 string

关于.NET HttpClient方式获取微信小程序码(二维码)

随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来.近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数):看了下小程序官方文档,以及网上的例子,未看到多少有价值的采用C#调用小程序接口生成小程序码的例子,于是拾起多年前的代码,略作分析尝试,在此分享给有需要的人,并以此抛砖引玉. 此文以HttpClient方式示例,当然采用老旧的HttpWebRequest也可以,在此不作分析.生成微信小程序码(二维码)的接口主要有三个: https://develo

小程序生成小程序码

getUnlimited 获取小程序码,适用于需要的码数量极多的业务场景.通过该接口生成的小程序码,永久有效,数量暂无限制. 小程序官方文档 wxacode.getUnlimited /// <summary> /// 获取小店小程序码 /// </summary> /// <returns>返回的图片 Buffer</returns> public object GetWxacode(string pagePath, int width, string I