• 关于canvas合成分享图


    最近在uni-app项目中遇到一个合成分享图的需求,其实最开始是用原生写法来做的,后来发现在PC端测试是可以的,但在APP模拟器中会出现问题,可能是因为两者的js环境不同吧,uni-app官网也说了这两者不能等同

     先来看看最开始写的原生方法

     1 // 获取下载链接
     2             getDownloadLink() {
     3                 this.$axios
     4                     .get('/app/address')
     5                     .then(res => {
     6                         console.log(res)
     7                         this.downloadLink = res.data.data
     8                         // 转二维码
     9                         this.makeCode()
    10                     })
    11                     .catch(err => {
    12                         console.log(err);
    13                     });
    14             },
    15             // 链接转二维码
    16             makeCode(){
    17                 let img = QR.createQrCodeImg(this.downloadLink,{'size':300});
    18                 this.downloadImg = img
    19                 console.log(img)
    20                 console.log(this.detailsData.banners[0])
    21                 
    22             },
    23             // 商品分享图片合成
    24             starDraw() {
    25                 let _that = this
    26                 let base64Img1 = 'data:image/gif;base64,'.concat(this.detailsData.bannersBase64[0])
    27                 console.log(base64Img1)
    28                 // console.log('data:image/gif;base64,'.concat(this.detailsData.bannersBase64[0]))
    29                 // return
    30                 var data = [base64Img1, this.downloadImg]
    31                 var base64 = []
    32                 var bigName = 'F.N次方'
    33                 var starName = this.detailsData.name
    34                 if(this.detailsData.lowestPrice === this.highestPrice){
    35                     var price = '¥' + this.detailsData.lowestPrice 
    36                 }else{
    37                     var price = '¥' + this.detailsData.lowestPrice + '~' + this.detailsData.highestPrice
    38                 
    39                 }
    40                 console.log(this.detailsData.banners[0])
    41                 console.log(price)
    42                 var c = document.createElement('canvas'),
    43                 // var c = this.$refs.canvas
    44                 ctx = c.getContext('2d'),
    45                 len = data.length
    46                 c.width = 300
    47                 c.height = 450
    48                 ctx.rect(0, 0, 300, 300)
    49                 ctx.fillStyle = '#fff'
    50                 ctx.fill()
    51                 function drawing(n) {
    52                     if (n < len) {
    53                         var img = new Image
    54                         // img.setAttribute("crossOrigin",'Anonymous')
    55                         // img.crossOrigin = 'Anonymous'; //解决跨域
    56                         img.crossOrigin = 'Anonymous'
    57                         img.src = data[n] 
    58                         img.onload = function () {
    59                             if (n == 1) {
    60                                 ctx.fillRect(0, 300, 300, c.height-300)
    61                                 ctx.fillStyle = '#fff'
    62                                 ctx.drawImage(img, c.width-110, 330, 100, 100);
    63                                 console.log(1)
    64                                 ctx.font = '14px sans-serif'
    65                                 ctx.textBaseline = 'top'
    66                                 ctx.textAlign = 'start'
    67                                 ctx.fillStyle = '#000'
    68                                 ctx.fillText(bigName,10,320)
    69                                 ctx.fillText(starName, 10, 340)
    70                                 ctx.font = '14px sans-serif'
    71                                 ctx.fillStyle = 'red'
    72                                 ctx.fillText(price, 10, 380)
    73                                 console.log(2)
    74                             } else {
    75                                 ctx.drawImage(img, 0, 0, c.width, c.height)
    76                             }
    77                             drawing(n + 1);
    78                         }
    79                     } else {
    80                         //保存生成作品图片
    81                         base64.push(c.toDataURL());
    82                         _that.base64Data = base64[0]
    83                         console.log(_that.base64Data)
    84                         // fn();
    85                     }
    86                 }
    87                 drawing(0);
    88             }

    这种事原生写法,在浏览器中测试能通过,但APP中会出错

    下面来看看使用uni-app的方法来解决的

     1 copyFn() {
     2                 let that = this
     3                 var goodsName = this.detailsData.name
     4                 var text = 'F.N'
     5                 if(this.detailsData.lowestPrice === this.highestPrice){
     6                     var price = '¥' + this.detailsData.lowestPrice 
     7                 }else{
     8                     var price = '¥' + this.detailsData.lowestPrice + '~' + this.detailsData.highestPrice
     9                 
    10                 }
    11                 let ww, hh;
    12                 let base64Img1 = 'data:image/gif;base64,'.concat(this.detailsData.bannersBase64[0])
    13                 const query = uni.createSelectorQuery().in(this);
    14                 query.select('#sss').boundingClientRect(data => {  //获取canvas-dom
    15                     ww = data.width; //准确的宽高
    16                     hh = 450
    17                     var ctx = uni.createCanvasContext('myCanvas') //绑定画布
    18                     ctx.drawImage(base64Img1, 0, 0, ww, 300); //填充进图片
    19                     // this.downloadImg
    20                     ctx.setFillStyle('#000')  //设置内容1的文字样式
    21                     ctx.setFontSize(20);
    22                     ctx.rect(0, 300, ww, 300)
    23                     ctx.setFillStyle('#fff')
    24                     ctx.fill()
    25                     ctx.drawImage(that.downloadImg, 240, 360, 100, 100)
    26                     // ctx.setTextAlign('center')  
    27                     ctx.setFillStyle('#000')
    28                     ctx.fillText(text,50,hh/2+120) 
    29                     // ctx.setTextAlign('center')  
    30                     ctx.fillText(goodsName,50,hh/2+150)
    31                     ctx.setFillStyle('red')  
    32                     ctx.setFontSize(16);
    33                     ctx.fillText(price,50,hh/2+180)
    34                     ctx.draw();  //输出到画布中
    35                     uni.showLoading({ //增加loading等待效果
    36                         mask:true
    37                     })
    38                     setTimeout(()=>{  //不加延迟的话,有时候会赋予undefined
    39                         uni.canvasToTempFilePath({
    40                             canvasId:'myCanvas',
    41                             success: (res) => {
    42                                 console.log(res.tempFilePath)
    43                                 this.shareImage=res.tempFilePath
    44                             }
    45                         })
    46                         uni.hideLoading();
    47                     },3000)
    48                 }).exec();
    49              
    50             }

    这样就能解决APP中报错的问题,然后再通过调用uni-app分享接口将合成图分享出去

  • 相关阅读:
    hdu 4308(bfs)
    数位dp
    hdu 4548(素数打表)
    不要把时间浪费在QQ上
    用插值方法构造多项式证明中值问题
    《摩诃般若波罗蜜多心经》 玄奘 译
    证明高斯引理
    《摩诃般若波罗蜜多心经》 玄奘 译
    若一整系数$n$次多项式在有理数域可约,则总可以分解成次数小于$n$的两整系数多项式之积.
    用teamviewer控制内网计算机
  • 原文地址:https://www.cnblogs.com/songyao666/p/11597362.html
Copyright © 2020-2023  润新知