小程序canvas绘图完整篇

2019-01-25  本文已影响0人  好奇的猫猫猫

这是我第二次画海报,完成后决定把整个流程写下来,供大家一起学习,不对的地方也请大家热心指教~
1.先给海报在页面上规定好宽高

       <!-- 画布大小按需定制  -->
<canvas canvas-id="springCanvas" style="width:328px;height:582px"></canvas>   

canvas-id一定要写,这就是海报要绘制的地方
如果不想看到绘制过程或效果,可以将canvas隐藏起来,我是这么写的

       <!-- 画布大小按需定制  -->
<view style='width:0px;height:0px;overflow:hidden;'>
    <canvas canvas-id="springCanvas" style="width:328px;height:582px"></canvas>   
</view> 

(如果有更好的方法,欢迎大家一起来讨论)
调试的时候我没有隐藏,因为可以直观的看到效果图进行修改完善
2.点击“保存海报”时触发canvas事件

<!--wxml文件-->
<div @tap="savePoster">保存海报</div>
<!--js文件-->
/*        
* 保存海报
*/
savePoster() {            
   var that = this;        
   this.drawCanvas();//调用绘制函数
   wx.showLoading({
   title: '努力生成中...'
   });
}
/**
* 绘制图片和文本
* 
*/
drawCanvas(){
   var that = this;
    //得到背景图片
    let promise1 = new Promise(function(resolve,reject){
          wx.getImageInfo({
          src:'图片地址',
          success:function(res){
               resolve(res);
          },
          fail:function(res){
                reject(res);
           }
           })
     })
     let promise2 = new Promise(function(resolve,reject){
          wx.getImageInfo({
               src:'图片地址',
                    success:function(res){
                        resolve(res);
                    },
                    fail:function(res){
                        reject(res);
                    }
                })
       })
       //成功得到图片信息后,开始绘图
      Promise.all([promise1, promise2])                        
            .then(res=>{
                wx.downloadFile({    //网络图片需要先下载到本地
                    url:'图片地址',
                    success(res) {
                        // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容
                        if (res.statusCode === 200) {
                            const ctx = wx.createCanvasContext('springCanvas')
                            ctx.drawImage(res.tempFilePath, 0, 0, 328, 582);
                            ctx.draw()
                            wx.downloadFile({    //下载第二张网络图片
                                url:'图片地址',
                                success(res){
                                    if (res.statusCode === 200) {
                                        ctx.drawImage(res.tempFilePath,11,44,305,25)
                                        ctx.draw(true)
                                        //开始绘制文字
                                        ctx.setTextAlign('center')  //居中
                                        ctx.setFontSize(16)   //字号
                                        ctx.setFillStyle('rgba(141,23,0,1)')  //字体颜色
                                        ctx.fillText(that.renderData.orgName, 165, 61)
                                        ctx.draw(true)  //设为true时,不会擦除之前绘制的内容
                                        ctx.setFillStyle('white')
                                        ctx.fillRect(220, 480, 80, 80) //绘制白色矩形 
                                        ctx.draw(true,setTimeout(function(){
                                            wx.canvasToTempFilePath({
                                            x:0,
                                            y:0,
                                            width:328,
                                            height:582,
                                            destWidth: 328,
                                            destHeight: 582,
                                            canvasId:'springCanvas',
                                            success:function(res){
                                                console.log('res.tempFilePath'+res.tempFilePath);            
                                                that.preurl=res.tempFilePath,  //该路径为生成海报图片的临时路径         
                                                wx.hideLoading()
                                                that.saveToAlbum()  //保存到相册
                                            },
                                            fail:function(res){
                                                console.log(res)
                                            }
                                            })
                                            },2000))
                                        }
                                    }
                                })
                             }
                        }
                    })    
            }).catch(function(error) {
                    console.log(error)
                })

        },
        /**
        * 保存到相册
        */
        saveToAlbum: function() {
            var that = this
            // 生产环境时 记得这里要加入获取相册授权的代码
            // 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.writePhotosAlbum" 这个 scope
            wx.getSetting({
                success(res) {
                if (!res.authSetting['scope.writePhotosAlbum']) {
                    wx.authorize({
                        scope: 'scope.writePhotosAlbum',
                        success() {
                        // 用户已经同意小程序相册功能,后续调用 wx.saveImageToPhotosAlbum 接口不会弹窗询问
                        that.startSaveImage()
                        }
                    })
                } else {
                    that.startSaveImage()
                }
                }
            })
        },

        startSaveImage() {
            let that = this
            wx.saveImageToPhotosAlbum({
                filePath: that.preurl,
                success(res) {
                }
            })

        },

OK,到这里,海报已绘制完成并下载到相册(包括网络图片的下载和绘制,文字的绘制,矩形的绘制)。
下一篇将会写关于绘制海报时文字换行问题,请大家多多关注~

上一篇下一篇

猜你喜欢

热点阅读