小程序canvas绘图完整篇

这是我第二次画海报,完成后决定把整个流程写下来,供大家一起学习,不对的地方也请大家热心指教~
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,到这里,海报已绘制完成并下载到相册(包括网络图片的下载和绘制,文字的绘制,矩形的绘制)。
下一篇将会写关于绘制海报时文字换行问题,请大家多多关注~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 【Android 自定义View之绘图】 基础图形的绘制 一、Paint与Canvas 绘图需要两个工具,笔和纸。...
    Rtia阅读 11,669评论 5 34
  • 业务中碰到微信小程序需要生成海报进行朋友圈分享,这个是非常常见的功能,没想到实际操作的时候花了整整一天一夜才搞好,...
    和牛阅读 2,712评论 0 4
  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,683评论 2 32
  • Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES ...
    温暖的外星阅读 3,174评论 2 10
  • 马上就要度过18个春夏秋冬了,只是我的人生好像还是一个小孩子一样。我习惯于依赖我能依赖的人,习惯于依靠可以依...
    YESHIIS阅读 202评论 0 1