精华内容
下载资源
问答
  • 我是一名普通的软件开发人员,技术写作让生性内向的我认识了很多志同道合,同样对企业应用设计开发有着浓厚兴趣的朋友们,也帮助了一些计划和刚刚进入这个领域的朋友们,从中我认识到了自己的价值。在书写一篇篇技术...

    公众号:汪子熙

    • SAP全球社区导师,SAP全球技术大使,在SAP社区发表了超过600篇的技术博客
    • 在SAP技术领域从业14年,参与多款SAP产品的设计和研发工作
    • 求知欲强烈,喜欢不断涉足新领域的知识,最近由于生了一场大病,对神经外科知识也有了一定的了解

    擅长领域:SAP应用技术

    我是一名普通的软件开发人员,技术写作让生性内向的我认识了很多志同道合,同样对企业应用设计开发有着浓厚兴趣的朋友们,也帮助了一些计划和刚刚进入这个领域的朋友们,从中我认识到了自己的价值。在书写一篇篇技术文章时,我也在书写着自己的人生。

    我的领英(linkedin)

    链接

    欢迎connect 😃

    在这里插入图片描述

    展开全文
  • 企业的广告投入开始从电视等传统媒体向基于圈层文化的新媒体精准营销转移,很多人都想制作一张属于自己的海报,本文介绍了手对手的教你用canvas画一个简单的海报的方法示例,感兴趣的可以了解一下
  • 那我们介绍讲讲朋友圈海报,怎么来勾起别人的欲望点击你的海报去看。 一、分析用户画像 设定奖品诱饵的时候一定要明确自己的目标粉丝群体,要先了解用户的需求和喜好。比如你的目标群体客户是什么性别、什么年龄段...

    现在朋友圈流行就是海报裂变玩法,一张海报方便简洁,能够快速的获得客户,往往一张裂变海报,包含了很多逻辑框架里去观察、思考,最后才是诸多的设计套路。一张优质的裂变海报,可以让你的宣传效果扩大 100 倍。朋友圈经常出现一些卖课海报,有一些做的惨不忍睹,完全没有让人想点击的欲望。那我们介绍讲讲朋友圈海报,怎么来勾起别人的欲望点击你的海报去看。

    在这里插入图片描述

    一、分析用户画像

    设定奖品诱饵的时候一定要明确自己的目标粉丝群体,要先了解用户的需求和喜好。比如你的目标群体客户是什么性别、什么年龄段的人?收入水平如何?然后投其所好,选择适合自己行业的奖品作为诱饵。比如教培行业的,可以送书籍、线下体验课、也可以选择虚拟商品,比如送电子书、资料包等等。

    二、裂变海报设计

    海报上要凸显“0元领”、“免费领”等字样,如果用户转发到朋友圈,他的好友在不点开图片的情况下也能大致了解这是一张福利海报,可能就会多停留几秒钟,然后仔细浏览详情。设计海报时力求文案精简,切勿追求过于炫酷的设计,否则就会喧宾夺主。活动海报不宜出现品牌标志,裂变海报主要是引流,后期再强化品牌概念。记住了海报却忽略了参加活动,岂不是得不偿失。

    三、活动文案

    的设置在工具后台设置活动规则、描述活动注意事项。用户扫描海报上的二维码,关注公众号,就能得到活动提示文案。一个裂变活动涉及到很多文案、朋友圈文案、社群文案、公众号文案。无论是哪一个渠道的推广文案,都不宜太过复杂,如果用户看不懂活动规则,不仅影响效果,还增加了客服的沟通成本。刺激用户转发分享不仅仅是钱和物的直接利益驱动,也可以是内容驱动。如果直接利益不能够,那就在文案上面多下点心思。

    在这里插入图片描述

    四、渠道推广的选择

    这也是影响活动的重要因素,奖品类型决定了看到的人会不会参加,而推广渠道则决定了到底有多少人参加这场活动。可以选择的渠道有:

    1、公众号推文(首选)

    2、朋友圈转发,内部人员工作群和其他社群相结合进行转发。最好是有用户自己的微信群。在种子用户里面推广活动。

    其他注意事项:

    1、二维码有效期不宜设置太长,48小时内最佳。如果活动特别火爆,时间可以再缩短。

    2、活动过程中要耐心解答粉丝问题,如果确实给用户造成了困扰,可以适当给一些补偿;

    3、如果公众号粉丝基数大,容易裂变开来,可以把活动流程设置得复杂一些,加大任务难度,既能过滤掉不精准粉丝,又可以有效控制流量。涨粉是一件长期进行的事,不是一蹴而就的,大家需要在这个过程中不断总结经验,这样才能把涨粉这件事做好。

    版权所有公众号:聪少爱学堂 专注分享全网引流精准引流方法及自媒体运营干货

    展开全文
  • 前端实现H5制作海报

    千次阅读 2019-07-20 08:59:50
    将海报模版与自己上传的照片进行合成并且贴上二维码,生成可长按保存的海报。 海报H5的基本功能: 接入微信SDK 上传照片、拍照 裁剪图片 将海报模板、二维码、上传的照片合成海报 长按保存图片 方案选择 方案一...

    基本介绍

    最终实现的需求是: 将海报模版与自己上传的照片进行合成并且贴上二维码,生成可长按保存的海报。

    海报H5的基本功能:

    1. 接入微信SDK
    2. 上传照片、拍照
    3. 裁剪图片
    4. 将海报模板、二维码、上传的照片合成海报
    5. 长按保存图片

    方案选择

    • 方案一: 采用第三方的裁剪库PhotoClip,和canvas的drawImage进行合成

    • 方案二: 采用第三方的裁剪库PhotoClip,和html2canvas纯前端合成

    方案选择:

    1. 方案一:需要解决移动端图片失真问题严重,二维码需要后台贴
    2. 方案二:可前端进行合成,图片还原度高

    小结: html2canvas确实是目前实现网页保存为图片的综合选择。

    实现步骤

    1. 接入微信SDK

    主要参考官方文档

    主要根据后台接口获取appId和signature,最后用wx.config获取所需接口的权限,比如:调用本地上传图片等

    前端采用vue框架,所以直接npm引入weixin-js-sdk

    2. 实现关键功能上传照片,进行裁剪,合成海报

    最终采用的是方案二

    方案一

    采用第三方的裁剪库PhotoClip,和canvas的drawImage进行合成

    • 在移动设备上双指捏合为缩放,双指转动为旋转
    • 在PC设备上鼠标滚轮为缩放,每次双击则顺时针旋转90度

    裁剪成功后,用drawImage合成海报

    关键代码

      // 解决移动端图片合成失真问题
      const ctx = this.canvas.getContext("2d");
      const dpr = this.getPixelRatio(ctx);
      var oldWidth = this.canvas.width;
      var oldHeight = this.canvas.height;
      this.canvas.style.width = oldWidth + 'px'; 
      this.canvas.style.height = oldHeight + 'px';
      this.canvas.width = oldWidth * dpr;
      this.canvas.height = oldHeight * dpr;
      ctx.scale(dpr, dpr);
    
      // 将两张图画进canvas
      ctx.drawImage(this.$refs.cropImg, 0, 0, 250, 400); // 裁剪后图片
      ctx.drawImage(this.$refs.postImg, 0, 0, 250, 400); // 海报模板
    
      // 合成后,将图片传给后台贴二维码
      this.canvas.toBlob()
    
      // 获取dpr
      getPixelRatio: function(context) {
        let backingStore = context.backingStorePixelRatio ||
          context.webkitBackingStorePixelRatio ||
          context.mozBackingStorePixelRatio ||
          context.msBackingStorePixelRatio ||
          context.oBackingStorePixelRatio ||
          context.backingStorePixelRatio || 1;
        return (window.devicePixelRatio || 1) / backingStore;
      }
    复制代码
      if (!HTMLCanvasElement.prototype.toBlob) {
        Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", {
          value: function(callback, type, quality) {
            var binStr = atob(this.toDataURL(type, quality).split(",")[1]),
              len = binStr.length,
              arr = new Uint8Array(len);
    
            for (var i = 0; i < len; i++) {
              arr[i] = binStr.charCodeAt(i);
            }
    
            callback(new Blob([arr], { type: type || "image/png" }));
          }
        });
      }
    复制代码

    方案二 采用第三方的裁剪库PhotoClip,和html2canvas纯前端合成

    裁剪后将模版图,裁剪图,和二维码一起通过html2canvas直接合成canvas即可

    关键代码

    // 调用本地相册
    <input type="file"  accept="image/*" capture="camera" size="30">
    // accept="image/*;capture=camera" 直接调用相机
    // accept="image/*" 调用相机 图片或者相册
    复制代码
      // 初始化插件
      let pc = new PhotoClip('#top', {
        size: [250,444],
        outputSize: [750,1334],
        maxZoom : 3,
        outputQuality: 1,
        lrzOption:{quality:1},
        adaptive: ['60%', '80%'],
        // file: '#file',
        view: '#view',
        ok: '#clipBtn',
        //是否开启图片自由旋转
        rotateFree: true,
        img: 'img/mm.jpg',
        loadStart: function () {
        },
        loadComplete: function() {
          console.log('照片读取完成');
        },
        done: function(dataURL) {
          console.log('dataURL:', dataURL)
        },
        //剪裁失败
        fail: function (err) {
            //msg(err);
        },
        //图片加载失败
        loadError: function(err) {
          msg(err);	                	
        }					
      });
      // html2canvas合成
      html2canvas(document.querySelector("#img-box"),
        {
          scale: 6,
          width:  document.querySelector('.img-box').offsetWidth,
          heith:  document.querySelector('.img-box').offsetHeight,
        }).then(function(canvas){
          //生成海报,将图片追加进dom
          var img = new Image();
          img.src = canvas.toDataURL('image/jpg');
          img.style.maxHeight = '100%'
          img.style.maxWidth = '100%'
          img.onload = () => {
            document.querySelector('.create-poster').append(img)
            document.querySelector('#img-box').removeChild
          }
        })
    
    复制代码

    踩坑记录

    图片跨域

    由于canvas对图片资源有同源限制

    如果图片的服务器允许跨域访问这个图片,那么你可以使用这个图片而不污染canvas,否则,使用这个图片将会污染canvas。

    解决方案:

    1. 服务端将图片配置Access-Control-Allow-Origin: *
    2. 设置html2canvasuseCORS[配置](html2canvas.hertzen.com/configurati…)
    3. 强制性跨域请求可使用crossorigin=“anonymous”属性

    drawImage图片失真

    解决方案:根据devicePixelRatiocanvas进行操作

    具体步骤:

    1. canvaswidthheight放大devicePixelRatio
    2. canvas.style.widthcanvas.style.height设置为原来大小
    3. canvas.scale(devicePixelRatio, devicePixelRatio)进行缩放

    具体代码

      const ctx = this.canvas.getContext("2d");
      const dpr = this.getPixelRatio(ctx);
      var oldWidth = this.canvas.width;
      var oldHeight = this.canvas.height;
      this.canvas.style.width = oldWidth + 'px'; 
      this.canvas.style.height = oldHeight + 'px';
      this.canvas.width = oldWidth * dpr;
      this.canvas.height = oldHeight * dpr;
      ctx.scale(dpr, dpr);
    
      //进行图片合成
      ctx.drawImage(this.$refs.cropImg, 0, 0, 250, 400);
      ctx.drawImage(this.$refs.postImg, 0, 0, 250, 400);
    
      // dpr
      getPixelRatio: function(context) {
        let backingStore = context.backingStorePixelRatio ||
          context.webkitBackingStorePixelRatio ||
          context.mozBackingStorePixelRatio ||
          context.msBackingStorePixelRatio ||
          context.oBackingStorePixelRatio ||
          context.backingStorePixelRatio || 1;
        return (window.devicePixelRatio || 1) / backingStore;
      }
    复制代码

    二维码图片的位置定位

    问题: 如何让二维码图片在不同屏幕下都定位到正确的位置。

    解决方法: 设为绝对定位,使用屏幕宽度作为基准设置 left、top 值。

    .qr-code {
        width: 10vw;
        position: absolute;
        left: 1vw;
        top: 2vw;
    }
    复制代码

    html2canvas读取透明底png图片变为不透明

    暂未解决

    html2canvas合成图的大小动态设置

    由于移动端需要进行适配,所以需要动态获取宽高进行设置合成图的宽高

      html2canvas(document.querySelector("#img-box"),
        {
          scale: 6,
          width: document.querySelector('#img-box').offsetWidth,
          heith: document.querySelector('#img-box').offsetHeight,
        }).then(function(canvas){
          //生成海报,将图片追加进dom
          var img = new Image();
          img.src = canvas.toDataURL('image/jpg');
          img.style.maxHeight = '100%'
          img.style.maxWidth = '100%'
          img.onload = () => {
            document.querySelector('.create-poster').append(img)
          }
        })
    
    } 
    复制代码

    附上源码

    转载于:https://juejin.im/post/5d207b1e6fb9a07ee85c4b40

    展开全文
  • 先简单介绍下这个小程序,主要是号召大家随手捡垃圾,如果你在马路上见到别人随手丢垃圾,可以将它拍下来,然后丢到垃圾桶,拍下来照片可以发布到这个小程序上,一是记录一下自己对干净家园行动,二是希望更多...

    前段时间做了个小程序-爱小环保,现在要给它加一个生成海报分享朋友圈的功能。

    先简单介绍下这个小程序,主要是号召大家随手捡垃圾,如果你在马路上见到别人随手丢的垃圾,可以将它拍下来,然后丢到垃圾桶,拍下来的照片可以发布到这个小程序上,一是记录一下自己对干净家园的行动,二是希望更多看到的人约束自己,不要随手丢垃圾。

    就当是打个广告了,现在进入正题,研究后发现要实现小程序生成海报基本有两种方法
    1、在小程序端用canvas画图生成
    2、在后端生成传到小程序端

    下面就讲一下这两种方法

    一、canvas实现

    只要有了素材,便可以在canvas上绘制出来了,小程序二维码素材,一般也有两种,一是特定页面(可能带参数)的二维码,二是小程序主页

    1、跳转小程序主页

    如果希望用户识别小程序码后直接跳到小程序主页,那就不用调用接口生成特定二维码,直接下载小程序码作为素材就可以,这时候将小程序码放到static/images文件夹里就可以直接绘制了,代码如下:

     //分享
      share: function(e){
        wx.showLoading({
          title: '正在生成图片...',
          mask: true,
        })
        var that = this
        var index = e.target.dataset.id;
        that.setData({
          index:index
        })
        wx.getImageInfo({
          src: that.data.litters[index].picurl,//这里是我获取的用户上传的垃圾图片
          success:function(res){
            that.drawSharePic(res.path)//实际绘图函数
          }
        })
      }
      //生成分享图片
      drawSharePic:function(litterPath){    
        const canvasCtx = wx.createCanvasContext('shareCanvas');//canvasid
        //绘制背景
        canvasCtx.setFillStyle('white');
        canvasCtx.fillRect(0, 0, 240, 360);
        canvasCtx.setFontSize(13);
        canvasCtx.setFillStyle('#333333');
        const text = "我在"+this.data.litters[this.data.index].address+"捡到了垃圾"
        var len = text.length
        if(len<=18){
          canvasCtx.fillText(text, 6, 20);
        }else{
          canvasCtx.fillText(text.substr(0,18),6,20)
          canvasCtx.fillText(text.substr(18, len-18), 6, 40)
        }
        const text1 = "我们的家园在我的努力下干净了一点点"
        const text2 = "识别二维码去守卫干净家园"
    
        canvasCtx.drawImage(litterPath, 70, 50, 100, 145);
        canvasCtx.fillText(text1, 10, 230);
    
        canvasCtx.drawImage('/static/images/qrcode.jpg', 90, 250, 60, 60);//我的小程序码
        canvasCtx.setFontSize(9);
        canvasCtx.fillText(text2, 65, 330);
        canvasCtx.draw();
        wx.hideLoading()  
      },
      //保存分享图片
      saveSharePic:function(){
        var that = this;
        wx.canvasToTempFilePath({
          x: 0,
          y: 0,
          width: 240,
          height: 360,
          destWidth: 240,
          destHeight: 360,
          canvasId: 'shareCanvas',
          success: function (res) {
            wx.saveImageToPhotosAlbum({
              filePath: res.tempFilePath,
              success(res) {
                wx.showModal({
                  title: '存图成功',
                  content: '图片成功保存到相册了,可以去发朋友圈啦',
                  showCancel: false,
                  confirmText: '好哒',
                  confirmColor: '#72B9C3',
                  success: function (res) {
                    if (res.confirm) {
                    }
                  }
                })
              }
            })     
          },
          fail: function (res) {
            console.log(res)
          }
        })
      },

    前端代码:

    <canvas style="margin:0 auto;margin-bottom:20px;width: 240px; height: 360px;" canvas-id="shareCanvas"></canvas> 
    <view style="text-align:center;padding-bottom:10px"><button  bindtap='saveSharePic' type="primary" size='mini'>保存到相册,分享至朋友圈</button></view>

    2、跳转特定页面

    如果希望用户跳到特定页面,例如通过海报分享某个商品出去,自然是希望用户识别后直接跳到商品页,这时候就需要调用接口生成小程序码了。代码和上面的区别就在于我们需要在后端通过接口获取特定的小程序码然后传给小程序

    share: function(e){
        wx.showLoading({
          title: '正在生成图片...',
          mask: true,
        })
        var that = this
        var index = e.target.dataset.id;
        that.setData({
          index:index
        })
        wx.getImageInfo({
          src: that.data.litters[index].picurl,
          success:function(res){
            that.setData({
              litterPicPath:res.path
            })
          }
        })
        wx.request({
          url: 'https://mydomain/site/qrcode',
          success:function(res){
            wx.getImageInfo({//因为绘制需要的是图片本地地址,因此使用这个函数
              src: res.data,
              success:function(res){
                that.drawSharePic(that.data.litterPicPath,res.path)
                wx.hideLoading()            
              }
            })
          }
        })
      },
        //生成分享图片
      drawSharePic:function(litterPath,qrcodePath){    
        const canvasCtx = wx.createCanvasContext('shareCanvas');
        //绘制背景
        canvasCtx.setFillStyle('white');
        canvasCtx.fillRect(0, 0, 240, 360);
        canvasCtx.setFontSize(13);
        canvasCtx.setFillStyle('#333333');
        const text = "我在"+this.data.litters[this.data.index].address+"捡到了垃圾"
        var len = text.length
        if(len<=18){
          canvasCtx.fillText(text, 6, 20);
        }else{
          canvasCtx.fillText(text.substr(0,18),6,20)
          canvasCtx.fillText(text.substr(18, len-18), 6, 40)
        }
        const text1 = "我们的家园在我的努力下干净了一点点"
        const text2 = "识别二维码去守卫干净家园"
    
        canvasCtx.drawImage(litterPath, 70, 50, 100, 145);
        canvasCtx.fillText(text1, 10, 230);
    
        canvasCtx.drawImage(qrcodePath, 90, 250, 60, 60);
        canvasCtx.setFontSize(9);
        canvasCtx.fillText(text2, 65, 330);
        canvasCtx.draw();
        wx.hideLoading()   
      },

    后端获取小程序码代码:

    public function actionQrcode(){
            //验证access_token是否过期
            $token_path = __DIR__."/../web/access_token";
            $life_time = 7200;
            if(file_exists($token_path)&&time()-filemtime($token_path)<$life_time){
                $access_token = file_get_contents($token_path);
            }else{
                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $output = curl_exec($ch);
                curl_close($ch);
                $output = json_decode($output);
                $access_token = $output->access_token;
                file_put_contents($token_path, $access_token);
            }
            //官方有三个接口,这里用的第二个,获取小程序码不限个数
            $url_qrcode = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='.$access_token;
            //参数可到官方文档查看
            $post_data = [
                'scene' => 'qrcode',
                'page'  => 'pages/start/start'//小程序码链接的页面
            ];
            $ch = curl_init();       
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_URL, $url_qrcode);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
            $qrcode = curl_exec($ch);
            curl_close($ch);
            $time = time();
            //将接口返回的内容存储为图片
            file_put_contents(__DIR__."/../web/img/".$time.".jpg", $qrcode);
            return "图片url";        
        }

    经过以上步骤,我生成的海报如下
    这里写图片描述
    这里写图片描述

    二、后端直接生成海报

    用上面方法生成的海报会有些单调,其实我们可以直接在后台生成,这样可以选择不同的背景图片
    前端代码如下:

    //用户可以选择背景主题
    <view style="text-align:center;color:white;margin-top:10px">选择主题</view>
        <view style="text-align:center;margin:20px 0">
        <image src="/static/images/style1.jpg" id="style1" bindtap='chooseImg' data-id="1" style="width:30%;margin-right:5px;height:350rpx" mode='aspectFit' class="{{choosed1?'active':''}}"></image>
        <image src="/static/images/style2.jpg" id="style2" bindtap='chooseImg' data-id="2" style="width:30%;margin-right:5px;height:350rpx" mode='aspectFit' class="{{choosed2?'active':''}}"></image>
        <image src="/static/images/style3.jpg" id="style3" bindtap='chooseImg' data-id="3" style="width:30%;height:350rpx" mode='aspectFit' class="{{choosed3?'active':''}}"></image>
        </view>
        <view style="text-align:center;padding-bottom:10px"><button  bindtap='getCard' type="primary" size='mini'>生成分享卡片</button></view>
    
    //选择主题
      chooseImg:function(e){
        var id = e.target.dataset.id
        var str = "choosed"+id
        var style = "style"+id
        console.log(id)
        this.setData({
          choosed1:false,
          choosed2:false,
          choosed3:false,
          style:style
        })
        this.setData({
          [str]:true
        })
      },
      //获取海报
      getCard:function(){    
        var that = this
        if(!this.data.choosed1&&!this.data.choosed2&&!this.data.choosed3){
          wx.showToast({
            title: '请选择主题',
            icon: 'none',
            duration: 2000
          })
        }else{
          this.setData({
            showDialog2: false
          })
          wx.showLoading({
            title: '正在生成卡片...',
            mask: true,
          })
          wx.request({
            url: 'https://mydomain/site/getcard',
            data:{
              style:that.data.style,
              litterid:that.data.index
            },
            success:function(res){
              wx.hideLoading()
              that.setData({
                cardUrl:res.data,
                showDialog3:true
              })
            }
          })
        }
      },
      //保存海报
      saveCard:function(){
        var that = this;
        wx.getImageInfo({
          src: that.data.cardUrl,
          success:function(res){
            wx.saveImageToPhotosAlbum({
              filePath: res.path,
              success(res) {
                wx.showModal({
                  title: '存图成功',
                  content: '图片成功保存到相册了,可以去发朋友圈啦',
                  showCancel: false,
                  confirmText: '好哒',
                  confirmColor: '#72B9C3',
                  success: function (res) {
                    if (res.confirm) {
                      that.setData({
                        showDialog3:false
                      })
                    }
                  }
                })
              }
            })  
          }
        })
      },
      //分享
      share: function(e){
        var litterid = e.target.id; 
        this.setData({
          showDialog2:true,
          index: litterid
        })
      },

    后端代码如下:

    //获取分享海报
        public function actionGetcard(){
            $get = Yii::$app->request->get();
            $litterid = $get['litterid'];
            $style = $get['style'];       
            $litter = Litter::findOne($litterid);
            $addr = $litter['address'];
            $pic = $litter['picurl'];
    
            $bg_path = __DIR__."/../web/img/".$style.".jpg";
    
    
            $bg_content = file_get_contents($bg_path);
            $bg_source = imagecreatefromstring($bg_content);
            $color = imagecolorallocate($bg_source, 0, 0, 0);
    
            $text = "我在".$addr."捡到了垃圾";
            $len = mb_strlen($text);
            if($len<=20){
                imagettftext($bg_source, 20, 0, 50, 80, $color,  __DIR__."/../web/fonts/msyh.ttc", $text);
            }else{
                imagettftext($bg_source, 20, 0, 50, 80, $color,  __DIR__."/../web/fonts/msyh.ttc", mb_substr($text,0,20));
                imagettftext($bg_source, 20, 0, 50, 110, $color,  __DIR__."/../web/fonts/msyh.ttc", mb_substr($text,20,$len-20));
            }
    
            list($width,$height) = getimagesize($pic);
            $pic_content = file_get_contents($pic);
            $pic_source = imagecreatefromstring($pic_content);
            imagecopy($bg_source, $pic_source, 195, 160, 0, 0, $width, $height);
            imagedestroy($pic_source);
    
    
            $time = time();
            $path = __DIR__."/../web/img/card/".$time.".jpg";
            imagejpeg($bg_source,$path);
            imagedestroy($bg_source);
    
            return "图片url";
        }

    使用流程如下:
    这里写图片描述
    生成的卡片如下:
    这里写图片描述

    以上就是教程全部内容了,文末送福利
    这里写图片描述

    展开全文
  • 将海报模版与自己上传的照片进行合成并且贴上二维码,生成可长按保存的海报。 海报H5的基本功能: 接入微信SDK 上传照片、拍照 裁剪图片 将海报模板、二维码、上传的照片合成海报 长按保存图片 方案选择 方案一...
  • 小程序海报分享功能还是很常用,今天这里介绍自己如果生成,有源码,拉下来安装一下依赖就可以使用了。注:生成图片清晰,不会随着不同手机,变形。 预览体验海报功能 3.生成海报效果图 二、实现代码过程...
  • 本文介绍了canvas 微信海报分享,分享给大家,具体如下: 随机产生一张图片 拿到微信用户头像和称呢(自己调后端接口获取) 把用户头像和称呢和随机产生一张图片合成一张海报 可能上一页用户还有填入心愿...
  • 相信很多刚从事设计行业的新人来说还比较陌生,相信大家肯定在电影院还有商场里见过不少让人眼前一亮、很有创意的海报了,那么现在小编来为大家介绍如何使用ps来制作一张自己心仪的海报。 1. 混合纹理 首先打开一个...
  • woc,今天已经是day -1了 再写一颗珂朵莉树来++rp吧 否则就要AFO了qaq ...窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 每贴一张海报暴力assign_val 最后用桶排思想统计一下即可 #pragma GCC op...
  • ▌导语一直对小程序开发很感兴趣,之前就准备做一款属于自己的小程序,无奈还需要购买云服务器和部署后台,有点麻烦,自从知道有了云开发这个免去服务器搭建和运维的一站式后端云服务“神器”,就一鼓作气花了几个...
  • 网站名称:MAKA网站网址:http://maka.im/H5 在线创作、海报制作、模板素材设计分享平台网站介绍:H5 已经成为移动端营销主要方式之一,对于非专业人士来说,常常借助一些H5 在线创作平台快速制作H5 页面。...
  • 大家好,我来兑现承诺了,我上个文章说过...这期文章我就给大家讲解我学习过程中制作的一张好看的海报,附带最详细最简化的ps软件功能介绍,让大家都能快速shang'shou原创不易,还望点赞评论,谢谢啦打开PS,载入psd...
  • 这些方面细讲起来需要几天几夜,而且你还需要实操,因为带鱼讲的你实际又做不出来,如果你想快速拥有国潮风的海报,那这样的介绍是不赶趟的。但是带鱼今天把自己整理的国潮素材全都拿了出来,这里面有样机、海报、...
  • 大学社团面试自我介绍范文 大学生活精彩之处在于各种各样社团,想进入自己心仪社团,一次好的介绍是就少不了。接下来,小编在这给大家带来大学社团面试自我介绍范文,欢迎大家借鉴参考! 大学社团面试自我介绍...
  • 关于我自己的一些事

    2020-09-06 22:22:25
    大一上学期,也就是刚军训完的时候,好多社团都开始纳新了嘛,碰巧就看到了Matrix工作室的海报,去听了宣讲之后觉得那些学长都好强了,然后就报名了。 啥也不懂,问了问学长,买了本书看,就是《C Primer Plus》,这...
  • 自己做了一个小程序,主要用于给头像加图标那种,和qq似,主要用canvas做, 第一回用,掉了很多坑,所以今天总结一下自己所做,如果大家有不理解地方,欢迎提问;如果帮到大家话,帮忙点个啥 canvas...
  • 学生会入会自我介绍 在学生会面试时的自我介绍非常重要,拥有一篇大学生自我介绍的范文...我喜欢做板报、海报时的感觉,总是在完成自己的灵感,为别人传达信息。 宣传部的工作大致上可以分为两个部分——定期的和不...
  • 读者协会面试自我介绍 优秀的自我介绍不仅体现于面试时,在日常生活中参加各种社团协会或者比赛都需要自我... 三,我认为在协会中能锻炼自己,通过参与协会工作,进一步加强自身修养,提高自己的演说能力,表达能...
  • 求职者该怎么介绍自己呢?下面是小编为大家整理求职面试自我介绍模板,仅供参考。求职面试自我介绍模板篇一: 首先,很荣幸能在这里面试,让我有向各位考官学习与交流机会,现在我就将简单做个一分钟自我介绍...
  • 高三毕业感言介绍.doc

    2021-01-15 15:26:25
    高三毕业感言介绍 下面请看由为大家介绍的高三毕业感言 我床头贴着一张海报,那上面密密麻麻记录着很多,有开学时目标,有模拟考成绩,有大学梦想,人生计划。现在看看,其实自己高三已经学到了很多,...
  • 面试社团自我介绍两篇 面试社团自我介绍范文: 大家好!我叫xxx,来自xx院xx专业某某班。前几天,我看到学校社团招新海报,第一个吸引我眼球就是职协,我当时就把职协当成我加入社团首选,并且最终成为唯一...
  • Segoe Font 介绍

    2019-10-03 00:08:42
    作为微软官方品牌字体,Segoe Font是一种非常优雅字体,小到海报大到Logo,Segoe字体应用在微软品牌宣传各种领域, 最著名就是在Vista中应用。你很难在网络上下载到这个字体,如果不管通过何种渠道得到了...
  • 前几天,我看到学校社团招新海报,第一个吸引我眼球就是职协,我当时就把职协当成我加入社团首选,并且最终成为唯一选择,你可能会问为什么,只选择职协,主要出于五点。 一,我对职业规划,有非常浓厚...
  • 关于大学社团招新自我介绍范文 大学社团是很多学生向往地方,那么要怎么样才能进入自己喜欢社团里面去?小编觉得社团面试中自我介绍很重要。下面是小编整理关于大学社团招新自我介绍范文,欢迎大家阅读。...

空空如也

空空如也

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

介绍自己的海报