小程序canvas生成圖片 ,并保存到相冊

在生成圖片中遇到的問題
1囊咏、canvas繪制文字不能換行塔橡,如果文字的長度大于你所定的寬度的話梅割,文字會超出你所定寬度葛家,或者文字會擠壓變形
解決辦法:截取一定的文字長度,多余的文字省略
2、微信小程序canvas畫圖必須用本地的圖片路徑,所以要把圖片下載下來存為臨時路徑再繪制圖片
解決辦法:微信提供了個api可用:wx.downloadFile(OBJECT)wx.getImageInfo(OBJECT)书蚪,都需先配置download域名才能生效迅栅。
3殊校、微信授權相冊功能读存,授權設置必須按鈕手動觸發(fā),不能放到回調里面
解決辦法:當用戶拒絕授權以后彈出一個模態(tài)窗让簿,當點擊模態(tài)窗的按鈕時對應不同的狀態(tài)
解決方案3代碼

                wx.getSetting({
                  success(res) {
                    // 如果沒有則獲取授權
                    if (!res.authSetting['scope.writePhotosAlbum']) {
                      wx.authorize({
                        scope: 'scope.writePhotosAlbum',
                        success() {
                          wx.saveImageToPhotosAlbum({
                            filePath: that.imageTempPath,
                            success() {
                                that.setToast('保存成功')
                            },
                            fail() {                                
                                that.setToast('保存失敗')
                            }
                          })
                        },
                        fail() {
                          wx.showModal({ 
                              title: '提示',
                              content: '需要獲取相冊訪問權限尔当,請到小程序設置頁面打開授權',
                              cancelText:'取消',
                              cancelColor:'#999',
                              confirmText:'確定',
                              confirmColor:'#f94218',
                              success(res) {
                                if (res.confirm) {
                                  wx.openSetting({
                                      success(res) {
                                        console.log(res.authSetting)
                                      }
                                    })                                
                                } else if (res.cancel) {
                                  console.log('用戶點擊取消')
                                }
                              }
                            })
                        }
                      })
                    } else {
                      // 有則直接保存不知道哦
                      wx.saveImageToPhotosAlbum({
                        filePath: that.imageTempPath,
                        success() {
                            that.setToast('保存成功')
                        },
                        fail() {
                           that.setToast('保存失敗')
                        }
                      })
                    }
                  }
                })

4、canvas生成圖片模糊的問題
解決辦法:繪制擴大2倍再生成圖片

繪制圖片
  • 創(chuàng)建canvas元素
    <canvas canvas-id="shareCanvas" style="width:600px;height:950px;margin: 50px auto 0;">
  • 繪制圖形
drawPage(){
                var ctx = wx.createCanvasContext('shareCanvas')
                ctx.save()
                ctx.beginPath()//開始繪制
                ctx.rect(0, 0, 600, 950)
                ctx.setFillStyle('#f5522c')
                ctx.fill()
//              ctx.closePath()
                ctx.restore();
                this.setLogo(ctx);//繪制頭像    
                ctx.beginPath()//開始繪制
                ctx.setFontSize(26)
//              ctx.scale(0.5,0.5)
                ctx.setFillStyle('#fff')
                ctx.setTextAlign('center')
                ctx.fillText(this.share_data.nick_name, 300, 164)
                ctx.setFontSize(32)         
                ctx.fillText('我中獎了:'+this.prizeName, 300, 210,540)
                ctx.rect(30, 232, 540, 690)
                ctx.fill()  
                ctx.closePath()
            },
            setLogo(ctx){
                var that =this;
                var avatarurl_width = 100;    //繪制的頭像寬度
                var avatarurl_heigth = 100;   //繪制的頭像高度
                var avatarurl_x = 250;   //繪制的頭像在畫布上的位置
                var avatarurl_y = 30;   //繪制的頭像在畫布上的位置
                wx.downloadFile({
                  url: that.change_url(that.share_data.logo),
                  success: function(res) {
                      ctx.save()
                      ctx.beginPath()//開始繪制
                      ctx.setFillStyle('#fff')
                       //先畫個圓   前兩個參數(shù)確定了圓心 (x,y) 坐標  第三個參數(shù)是圓的半徑  四參數(shù)是繪圖方向  默認是false锐帜,即順時針
                      ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false);   
                      //畫好了圓 剪切  原始畫布中剪切任意形狀和尺寸畜号。一旦剪切了某個區(qū)域,則所有之后的繪圖都會被限制在被剪切的區(qū)域內 這也是我們要save上下文的原因    
                      ctx.clip()
                      ctx.drawImage(res.tempFilePath,avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth);
                      ctx.closePath()
                      //恢復之前保存的繪圖上下文 恢復之前保存的繪圖上下文即狀態(tài) 還可以繼續(xù)繪制
                      ctx.restore()
//                    ctx.stroke()
                      //可將之前在繪圖上下文中的描述(路徑蛮拔、變形替饿、樣式)畫到 canvas 中                                         
                       if(that.share_data.lottery_cover){
                        that.setBanner(ctx)
                      }else{
                        that.setPrize(ctx)
                      } 
                  },
                  fail(err){
                    wx.hideLoading();
                    that.setToast(err.errMsg);
//                  that.$store.commit('set_toast_msg', err.errMsg);
                  }
                })
            },
            setBanner(ctx){
                var that = this;
                wx.downloadFile({
                  url: that.change_url(that.share_data.lottery_cover),
                  success: function(res) {
                      ctx.drawImage(res.tempFilePath, 50, 250,500, 250);
                      ctx.save();
                      ctx.restore();
                      //繪制獎品名字
                      that.setPrize(ctx)
                  },
                  fail(err){
                    wx.hideLoading();
                    that.setToast(err.errMsg);
//                  that.$store.commit('set_toast_msg', err.errMsg);
                  }
                })
            },
            setPrize(ctx){
                var that =this;
                ctx.setFontSize(26)
                ctx.setFillStyle('#999')                
                ctx.setTextAlign('center')
                ctx.fillText('長按識別小程序,參與抽獎', 300, 830)
                ctx.setStrokeStyle('#fff')
                ctx.stroke()
                ctx.restore();              
                if(that.qrcode_url){
                    //繪制二維碼
                    that.setQrcode(ctx)
                }else{
                    that.showImg(ctx);
                }
            },
            setQrcode(ctx){
                var that = this;
                var avatarurl_width = 200;    //繪制的頭像寬度
                var avatarurl_heigth = 200;   //繪制的頭像高度
                var avatarurl_x =200;   //繪制的頭像在畫布上的位置
                var avatarurl_y =570;   //繪制的頭像在畫布上的位置
                wx.downloadFile({
                    url: that.change_url(that.qrcode_url),
                    success: function(res) {
                        ctx.save()
                        ctx.beginPath()
                        ctx.setFillStyle('#dcdcdc')
                        ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false); 
                        ctx.clip()
                        ctx.drawImage(res.tempFilePath,avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth);
                        ctx.closePath()
                        ctx.restore()
                        that.showImg(ctx);
                  },
                  fail(err){
                    wx.hideLoading();
                    that.setToast(err.errMsg);
//                  that.$store.commit('set_toast_msg', err.errMsg);
                  }
                })
            },
            showImg(ctx){
                var that =this;
                ctx.draw(false, function (e) {                  
                    console.log('繪制成功')
                    setTimeout(function(){
                        wx.canvasToTempFilePath({
                        canvasId: 'shareCanvas',
                        fileType:'jpg',
                        quality:1,
                        destWidth:600,
                        destHeight:950,
                        success: function(res) {
                          // 獲得圖片臨時路徑
                          that.imageTempPath = res.tempFilePath;
                          that.imgSrc=that.imageTempPath;
                          setTimeout(function(){
                            that.loading_show=false;
                            wx.hideLoading();
                          },50)                       
                          console.log(res.tempFilePath)
                        }
                      })
                    },50)
                })
            },
            saveImg(){
                var that =this;
                // 獲取用戶是否開啟用戶授權相冊
                wx.getSetting({
                  success(res) {
                    // 如果沒有則獲取授權
                    if (!res.authSetting['scope.writePhotosAlbum']) {
                      wx.authorize({
                        scope: 'scope.writePhotosAlbum',
                        success() {
                          wx.saveImageToPhotosAlbum({
                            filePath: that.imageTempPath,
                            success() {
                                that.setToast('保存成功')
                            },
                            fail() {                                
                                that.setToast('保存失敗')
                            }
                          })
                        },
                        fail() {
                          wx.showModal({
                              title: '提示',
                              content: '需要獲取相冊訪問權限,請到小程序設置頁面打開授權',
                              cancelText:'取消',
                              cancelColor:'#999',
                              confirmText:'確定',
                              confirmColor:'#f94218',
                              success(res) {
                                if (res.confirm) {
                                  wx.openSetting({
                                      success(res) {
                                        console.log(res.authSetting)
                                      }
                                    })                                
                                } else if (res.cancel) {
                                  console.log('用戶點擊取消')
                                }
                              }
                            })
                        }
                      })
                    } else {
                      // 有則直接保存
                      wx.saveImageToPhotosAlbum({
                        filePath: that.imageTempPath,
                        success() {
                            that.setToast('保存成功')
                        },
                        fail() {
                           that.setToast('保存失敗')
                        }
                      })
                    }
                  }
                })
            },
  • 在onLoad里面執(zhí)行drawPage方法
onLoad(){
  this.drawPage();
}
//saveImg  保存圖片方法
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末惋砂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绳锅,更是在濱河造成了極大的恐慌西饵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳞芙,死亡現(xiàn)場離奇詭異眷柔,居然都是意外死亡期虾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝶柿,你說我怎么就攤上這事∶荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵剃幌,是天一觀的道長聋涨。 經常有香客問我,道長负乡,這世上最難降的妖魔是什么牍白? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任敬鬓,我火速辦了婚禮淹朋,結果婚禮上,老公的妹妹穿的比我還像新娘钉答。我一直安慰自己础芍,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布数尿。 她就那樣靜靜地躺著仑性,像睡著了一般。 火紅的嫁衣襯著肌膚如雪右蹦。 梳的紋絲不亂的頭發(fā)上诊杆,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音何陆,去河邊找鬼晨汹。 笑死,一個胖子當著我的面吹牛贷盲,可吹牛的內容都是我干的淘这。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巩剖,長吁一口氣:“原來是場噩夢啊……” “哼铝穷!你這毒婦竟也來了?” 一聲冷哼從身側響起佳魔,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤曙聂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鞠鲜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宁脊,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡断国,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朦佩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并思。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖语稠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情弄砍,我是刑警寧澤仙畦,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站音婶,受9級特大地震影響慨畸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜衣式,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一寸士、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碴卧,春花似錦弱卡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荧飞,卻和暖如春凡人,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叹阔。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工挠轴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耳幢。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓岸晦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帅掘。 傳聞我的和親對象是個殘疾皇子委煤,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容