小程序canvas繪制并保存圖片

這篇主要講canvas繪制以及保存到本地相冊的方法

實現(xiàn)功能如下:

1.用戶手動輸入文字骑歹,并把這些文字繪制到canvas中

2.將圖片繪制到canvas中

3.將canvas變成圖片并保存到本地相冊中

效果如圖:


3.png
b.png

第一部分 wxml

<canvas type="2d" id='MyCanvas' style="width:{{widthC}}px;height:{{heightC}}px;" wx:if="{{showCanvas}}"

要注意寫這種形式tpye='2d'预烙,這是新版本的,舊版本的如下圖已經(jīng)不維護了道媚,所以建議寫這種扁掸,另外要注意id,不是寫canvas-id最域,而只是id


image

第二部分 js

 第一步谴分,先獲取canvas標簽
 const canvasQuery = wx.createSelectorQuery()  
 //返回一個對象實例,通過實例可以獲取canvas
     canvasQuery.select('#MyCanvas')
    .fields({
      node: true,
      size: true,
      rect: true
    })
    .exec(this.CanvasInit.bind(this))  
    //bind(this)包含了canvas的node镀脂,size和rect
    
第二步牺蹄,初始化并繪制canvas
    const width = res[0].width
    this.canvasWidth = width
    const height = res[0].height
    this.canvasHeight = height

    const canvas = res[0].node
    this.canvas = canvas
    const ctx = canvas.getContext('2d')
    
    //使canvas適應(yīng)各種屏幕不至于大小不同
    const dpr = wx.getSystemInfoSync().pixelRatio
    canvas.width = width * dpr
    canvas.height = height * dpr
    ctx.scale(dpr, dpr)
    
      //畫布背景顏色
    ctx.fillStyle = '#fff'
    ctx.fillRect(0, 0, width, height)

    // 繪制圖片 這里要注意drawImage方法中傳入的是img對象,而不是img.src
    const img = canvas.createImage()
    img.src = ImgPath // 可以是本地地址也可以是網(wǎng)絡(luò)地址
    img.onload = () => ctx.drawImage(img, 0, 0, this.widthImg, this.heightImg)  
    
     // 繪制文字部分
    // console.log(this.widthImg)
    ctx.fillStyle = "#000000"
    ctx.font = "normal 18px Arial"
    ctx.fillText(this.time, 18, this.heightImg + 20)
    ctx.fillText(this.wea, 150, this.heightImg + 20)
    
第三步薄翅,獲取用戶保存圖片權(quán)限
  通過wx.getSetting()來獲取用戶已經(jīng)授權(quán)過的權(quán)限信息沙兰。注意如果用戶已經(jīng)授權(quán)
過,那么所獲取的權(quán)限信息里面就會有scope.writePhotosAlbum翘魄,即使是沒有同意
也會存在scope.writePhotosAlbum鼎天,所以不要誤以為有scope.writePhotosAlbum
就是一定同意了。還有一個坑的地方就是如果用戶第一次授權(quán)沒有同意暑竟,那么之后就
不會再彈出授權(quán)對話框斋射,需要自己進行判斷。
  if (['scope.writePhotosAlbum'] in res.authSetting) {
          // 如果授權(quán)過且同意了
          if (res.authSetting[`scope.writePhotosAlbum`]) {
            this.canvasToImgSave()
          } else {
            wx.showModal({
              title: "請求授權(quán)相冊存儲",
              content: "需要獲取您的相冊存儲權(quán)限,請確認授權(quán)",
              success: res => {
                if (res.confirm) {
                  wx.openSetting({
                    success: res => {
                      this.canvasToImgSave()
                      console.log(res)
                    },
                    fail: err => {
                      console.log(err)
                    }
                  })
                } else if (res.cancel) {
                  console.log("你又取消了")
                }
              }
            })
          }
        } else {
          this.canvasToImgSave()
        }
      }

第四步罗岖,將canvas繪制成圖片并保存
  這里也有一個小坑涧至,就是在繪制圖片的時候會消耗一點時間,因此不能立即就繪制
成功桑包。如果你沒有等待繪制成功就直接保存圖片的話就會使保存的圖片為空白南蓬。這時
可以使用wx.showloading來提示用戶圖片在生成中。
    wx.showLoading({
      title: '生成中...',
    })
    wx.canvasToTempFilePath({
      canvas: this.canvas,
      x: 0,
      y: 0,
      width: this.canvasWidth * 2,
      height: this.canvasHeight * 2,
      destWidth: this.canvasWidth * 2,
      destHeight: this.canvasHeight * 2,
      success: res => {
        wx.saveImageToPhotosAlbum({
          filePath: res.tempFilePath,
          success: res => {
            // console.log(this.saveTempFilePath)
            wx.showModal({
              title: "保存成功捡多!",
              content: "圖片已保存到本地相冊",
              showCancel: false,
              success(res) {
                if (res.confirm) {
                  wx.reLaunch({
                    url: '/pages/joinU/joinU'
                  })
                }
              }
            })
          },
          fail: err => {
            console.log(err)
          }
        })
      },
      fail: err => {
        console.log(err)
      }
    })
    setTimeout(() => {
      wx.hideLoading()
    }, 1000)

這么一寫下來也沒有什么特別難的地方蓖康。其實還可以實現(xiàn)用戶手動上傳圖片铐炫,這樣可能會更有趣一點

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垒手,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子倒信,更是在濱河造成了極大的恐慌科贬,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳖悠,死亡現(xiàn)場離奇詭異榜掌,居然都是意外死亡,警方通過查閱死者的電腦和手機乘综,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門憎账,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卡辰,你說我怎么就攤上這事胞皱。” “怎么了九妈?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵反砌,是天一觀的道長。 經(jīng)常有香客問我萌朱,道長宴树,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任晶疼,我火速辦了婚禮酒贬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翠霍。我一直安慰自己同衣,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布壶运。 她就那樣靜靜地躺著耐齐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埠况,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天耸携,我揣著相機與錄音,去河邊找鬼辕翰。 笑死夺衍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喜命。 我是一名探鬼主播沟沙,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壁榕!你這毒婦竟也來了矛紫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤牌里,失蹤者是張志新(化名)和其女友劉穎颊咬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牡辽,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡喳篇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了态辛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麸澜。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奏黑,靈堂內(nèi)的尸體忽然破棺而出炊邦,到底是詐尸還是另有隱情,我是刑警寧澤攀涵,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布铣耘,位于F島的核電站,受9級特大地震影響以故,放射性物質(zhì)發(fā)生泄漏蜗细。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一怒详、第九天 我趴在偏房一處隱蔽的房頂上張望炉媒。 院中可真熱鬧,春花似錦昆烁、人聲如沸吊骤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽白粉。三九已至传泊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸭巴,已是汗流浹背眷细。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹃祖,地道東北人溪椎。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像恬口,于是被迫代替她去往敵國和親校读。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容