2020-07-16微信小程序海报生成问题总结

1.画布绘制背景图,drawImage方法的argument.length = 9
[0]:url地址
[1]:裁剪区域左上方X轴坐标
[2]:裁剪区域左上方Y轴坐标
[3]:整个裁剪区域的宽度
[4]:整个裁剪区域的高度
注:官方文档对这个方法的参数说明,很绕,确实是我语文门卫教的。裁剪区域是相对于图片本身的尺寸为参照。而不是画布可视区域。
[5.6.7.8]就是在画布上要绘制的区域坐标,和区域尺寸。

2.小程序码动态生成,移步官方文档,这里是后台去生成,前端不做处理,因为生成的接口需要传app secret,这是很敏感的,不能在前台用。

3.海报合成,小程序码返回的必须是http网络地址,base64亲测不行,大坑!直接绘制的话本地调试是可以的,但是手机上就是空白的。downloadfile方法调用的话,会报域名不在白名单(特么base64有个毛的域名,坑在这,我不晓得怎么解决)
所以,接口返回http网络地址,再通过downloadfile方法,拿到res.tempFilePath,用这个临时地址在画布上绘制,就ok了。

4.downloadfile 域名白名单,设置了之后,去详情-配置 里面的域名配置刷新一下。*(我太蠢了)

getQrcode() {
    // 接口返回图片
    return app.$request.teamQr()
  },
  getImage() {
    let _this = this;
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success (res) {
        // tempFilePath可以作为img标签的src属性显示图片
        const tempFilePaths = res.tempFilePaths;
        
        _this.setData({
          bg: tempFilePaths[0]
        })
      }
    })
  },
  onClose() {
    this.setData({
      posterShow: false
    })
  },
  saveImage: async function() {
    wx.showLoading({
      title: '海报生成中...'
    });
    let self = this;
    const ctx = wx.createCanvasContext('myCanvas');
    ctx.setFillStyle('white')
    ctx.fillRect(0, 0, 276, 444)
    console.log(self.data.bg);
    let post = self.data.bg;
    let { width, height } = await self.getSize(post);
    let actWidth =  height*(276/355);
    let coord = [
      (width - actWidth)/2,
      0,
      actWidth,
      height,
    ];
    console.log(self.data.qrcodeUrl);
    wx.downloadFile({
      url: self.data.qrcodeUrl, //个人logo
      success: function(res) {
        let logo = res.tempFilePath;
        wx.hideLoading();
        // ctx.drawImage(post, 540,0,839,1080,0,0,276,355);
        ctx.drawImage(post, coord[0], coord[1], coord[2], coord[3],0,0,276,355);
        ctx.fillStyle = "#fff";
        ctx.fillRect(95, 306, 86, 86); 
        ctx.drawImage(logo, 97, 308, 82, 82);
        ctx.setFontSize(12)
        ctx.setFillStyle('#333');
        ctx.setFontSize(12)
        ctx.setFillStyle('#fb5e2c');
        //长按识别打开小程序文字位置
        ctx.setFontSize(12)
        ctx.setFillStyle('#333');
        ctx.fillText('长按识别打开小程序', (276 - ctx.measureText('长按识别打开小程序').width) / 2, 410)
        ctx.draw(false, function(e) {
          wx.canvasToTempFilePath({
            x: 0,
            y: 0,
            width: 375,
            height: 417,
            quality: 1,
            canvasId: 'myCanvas',
            success: function(respon) {
              ctx.setFillStyle('white')
              self.setData({
                postImage: respon.tempFilePath,
                posterShow: true
              })
            },
            fail: function(res) {
              wx.showToast({
                title: 'canvasToTempFilePath---fail',
                icon: 'none'
              })
            }
          });
        });
      },
      fail: function(res) {
        console.log(res);
        wx.showToast({
          title: '二维码下载失败,请重新生成1',
          icon: 'none'
        })
      }
    });
  },
  // 获取背景图片尺寸
  getSize(url) {
    return new Promise((resolve, reject) => {
      wx.getImageInfo({
        src: url,
        success (res) {
          console.log(res.width)
          console.log(res.height)
          resolve(res)
        }
      })
    })
  },
// 2、点击保存到相册时做授权处理
  save: function() {
    var _this = this;
    wx.getSetting({
      success(res) {
        console.log(res)
        if (res.authSetting['scope.writePhotosAlbum'] != undefined && res.authSetting['scope.writePhotosAlbum'] != true) {
          wx.showModal({
            title: '提示',
            content: '您未授权保存到相册,确认授权?',
            success: function (res) {
              if (res.confirm) {
                wx.openSetting({
                  success: function (res) {
                    if (res.authSetting["scope.writePhotosAlbum"] == true) {
                    } else {
                    }
                  }
                })
              }
            }
          })
        } else {
          wx.saveImageToPhotosAlbum({
            filePath: _this.data.postImage,
            success(res) {
              console.log('保存成功---ok')
              wx.showToast({
                title: '保存成功',
                icon: 'none'
              });
              wx.navigateBack({
                delta: 1
              })
            }
          })
        }
      },
      fail: function(e) {
        console.log(999)
      }
    });
  
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352