成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Canvas繪圖在微信小程序中的應(yīng)用:生成個(gè)性化海報(bào)

vpants / 1701人閱讀

摘要:解析進(jìn)到首頁(yè)其實(shí)關(guān)鍵字在本地就隨機(jī)取完了,在首頁(yè)中的方法中就通過(guò)緩存了要畫(huà)的元素,比如關(guān)鍵字這里是圖片關(guān)鍵字解析語(yǔ)也是圖片畢竟微信小程序的不支持字體等等。

一、Canvas應(yīng)用的背景(個(gè)人理解)及基礎(chǔ)語(yǔ)法 背景

從2012年開(kāi)始,微信那個(gè)時(shí)候用戶(hù)的積累的量已經(jīng)非常大了,推出公眾號(hào),當(dāng)然大屏智能手機(jī)在那個(gè)時(shí)候也流行,傳統(tǒng)的大眾媒體逐步消亡,像微信公眾號(hào)這樣的新媒體盛行。企業(yè)的廣告投入開(kāi)始從電視等傳統(tǒng)媒體向基于圈層文化的新媒體精準(zhǔn)營(yíng)銷(xiāo)轉(zhuǎn)移,甚至很多企業(yè)尤其互聯(lián)網(wǎng)企業(yè)開(kāi)始思考如何利用用戶(hù)的自傳播這種方式去宣傳企業(yè)、實(shí)現(xiàn)商業(yè)目標(biāo)。而用戶(hù)的自傳播很好的途徑就是生產(chǎn)個(gè)性化的海報(bào)。舉個(gè)最常見(jiàn)的例子,我第一次使用Keep是因?yàn)樵谂笥讶吹脚笥逊窒硭\(yùn)動(dòng)量的一個(gè)截圖,當(dāng)時(shí)在我看來(lái)非常酷,有心率脈搏呀、時(shí)速運(yùn)動(dòng)量啊、消耗的卡路里等,還有一個(gè)二維碼,然后我就點(diǎn)了下載了Keep,這整個(gè)獲客成本幾乎為0,秒秒鐘就多了一個(gè)用戶(hù)。而實(shí)現(xiàn)這一過(guò)程的技術(shù)手段就可以用canvas。所以,canvas的盛行,與企業(yè)的精準(zhǔn)營(yíng)銷(xiāo)和用戶(hù)的自傳播有很大的關(guān)系。
如極客時(shí)間的一些實(shí)現(xiàn)案例:

大家看第一張圖的話(huà)是在2017年末的時(shí)候,Qcon全球軟件開(kāi)發(fā)大會(huì)預(yù)熱階段的海報(bào)。然后我們?yōu)槌绦騿T做了一個(gè)生成2018年關(guān)鍵字的一張海報(bào),文案都非常有趣啊。第二張的話(huà)是在2018年元旦的時(shí)候做的極客時(shí)間助手,這個(gè)小程序當(dāng)初主要是為程序員做的2018年新年簽。那面就是一些極客時(shí)間的專(zhuān)欄,包括用戶(hù)留言,你留言隨手可以生成一張海報(bào),可以轉(zhuǎn)發(fā)等等大概就是這樣。

基礎(chǔ)語(yǔ)法

Canvas本質(zhì)是一個(gè)可以使用腳本(通常為JavaScript)來(lái)繪制圖形的 HTML 元素,默認(rèn)大小為300像素×150像素(寬×高,像素的單位是px),通過(guò)JavaScript上下文對(duì)象動(dòng)態(tài)創(chuàng)建圖像。比如,畫(huà)線(xiàn)、畫(huà)矩形、涂顏色甚至生成帶二維碼的海報(bào)。原理就是一筆一筆的畫(huà),畫(huà)一條橫線(xiàn),再畫(huà)一條橫線(xiàn)等等,就是不斷地創(chuàng)建路徑、繪制路徑,然后把這個(gè)路徑封閉起來(lái)可以涂色之類(lèi)的,他的底層的封裝就是放到一個(gè)數(shù)組里形成一個(gè)路徑的數(shù)組,將這個(gè)數(shù)組傳到j(luò)s底層的一個(gè)方法,然后去繪制。

舉個(gè)栗子:畫(huà)一個(gè)頭像

首先,你需要把這張圖片畫(huà)canvas上面,比如說(shuō)你畫(huà)你這個(gè)頭像就是正方形,就在(0,0)開(kāi)始畫(huà)一個(gè)圖片。那么你在這個(gè)圖片的中心,作為原點(diǎn),然后你畫(huà)一個(gè)圓形。然后你再利用canvas語(yǔ)法畫(huà)一個(gè)圓弧,在這個(gè)圓弧路徑以外設(shè)置不可見(jiàn)以?xún)?nèi)設(shè)置可見(jiàn),這個(gè)時(shí)候就形成了一個(gè)圓形頭像。

  
  
二、常用的"生成海報(bào)"的方式

我們會(huì)經(jīng)常在朋友圈看到什么算命、性格分析、測(cè)算你的智商、情商等等這些東西,都是由用戶(hù)分享出一張圖片(海報(bào)),這個(gè)圖片就是用canvas做成的,上面畫(huà)了二維碼,二維碼是一個(gè)數(shù)組兩個(gè)或循環(huán)嵌套畫(huà)小黑點(diǎn)用戶(hù)識(shí)別這個(gè)二維碼之后就進(jìn)入他的程序,經(jīng)過(guò)程序跑出來(lái)的測(cè)試結(jié)果啊什么的,點(diǎn)保存的時(shí)候,就會(huì)生成一張個(gè)性海報(bào)明白。怎么生成這種個(gè)性化海報(bào)呢?

2.1 字符串模板

此處應(yīng)有案例

主要實(shí)現(xiàn):與服務(wù)端約定好數(shù)據(jù)格式-->前端做好模板-->服務(wù)端用第三方工具渲染返回到客戶(hù)端img
首先與服務(wù)端約定好數(shù)據(jù)格式,比如關(guān)鍵字是什么、頭像URL、昵稱(chēng)等等,把所有放數(shù)據(jù)格式的地方用{{{}}}嵌套,告訴后端位置;然后,將前端模擬數(shù)據(jù)摳去,比如user.tags,把這一段html的字符串模板給到服務(wù)端,最后服務(wù)端拿到數(shù)據(jù)通過(guò)html2canvas這樣的第三方工具把圖片渲染返回給客戶(hù)端展示,讓用戶(hù)可以長(zhǎng)按這張圖片保存到手機(jī)相冊(cè)。這是比較傳統(tǒng)的方式早些年基本上都是通過(guò)這種方式。
有什么弊端呢?
一是第三方工具維護(hù)不及時(shí)、不支持flex布局、ES6等語(yǔ)法,二是調(diào)試不方便,三是高并發(fā)的時(shí)候會(huì)出問(wèn)題,特別是生成的是高清無(wú)碼的海報(bào)的時(shí)候

2.2 canvas繪制

案例: "極客時(shí)間小助手"小程序
主要實(shí)現(xiàn):前端直接通過(guò)canvas生成海報(bào)
搖晃手機(jī)抽取新年簽跳到第一個(gè)頁(yè)面,需要繪制頭像、關(guān)鍵字以及保存按鈕,黃色的保存按鈕其實(shí)就是呃一張透明的png圖片,把它畫(huà)上去。那在這個(gè)button上面兒需要固定一個(gè)寬高和它差不多大小的一個(gè)空的、透明的div,在這個(gè)div上加點(diǎn)擊事件,這個(gè)事件就是調(diào)第二張要保存的那個(gè)canvas。第二張這個(gè)是沒(méi)有保存按鈕的但有二維碼。帶二維碼的這張canvas放哪里呢?一種方案是定位,給一個(gè)特別大的top或left,讓它不顯示在屏幕里邊;另一個(gè)方案是層級(jí),預(yù)覽的這張canvas在真正要保存canvas圖片之上,但是會(huì)有問(wèn)題。手機(jī)瀏覽器版本低的話(huà),定了層級(jí)不管用,一些安卓手機(jī)也會(huì)有問(wèn)題,有時(shí)候會(huì)浮上來(lái)沒(méi)被蓋住。
當(dāng)然,如果要實(shí)現(xiàn)保存高清圖的話(huà),還是需要處理的,那就是放大,不過(guò)這個(gè)是笨方法。最優(yōu)的方法是拆解這張圖像,確保導(dǎo)出的canvas是最高清的,而且對(duì)用戶(hù)來(lái)說(shuō)也是最省流量的。
解析:進(jìn)到首頁(yè)其實(shí)關(guān)鍵字在本地就隨機(jī)取完了,在首頁(yè)index.js中的onShow方法中就通過(guò)wx.getStorageSync緩存了要畫(huà)的元素,比如關(guān)鍵字(這里是圖片)、關(guān)鍵字解析語(yǔ)(也是圖片,畢竟微信小程序的canvas不支持字體)等等。搖一搖觸發(fā)重力感應(yīng)事件wx.onAccelerometerChange監(jiān)聽(tīng)里面的事件,獲取用戶(hù)授權(quán)拿到頭像并跳轉(zhuǎn)到poster頁(yè)面。直接就開(kāi)始畫(huà)兩張圖片,一張有二維碼的(shakepage1),一張有button的(shakepage2),這里二維碼是"死碼",button也是在圖片的基礎(chǔ)上覆蓋一個(gè)view,畫(huà)完之后調(diào)canvasToTempFilePath保導(dǎo)出那張帶碼的,此時(shí)帶碼的這張通過(guò)css設(shè)置visibility: hidden隱藏起來(lái)。點(diǎn)擊按鈕觸發(fā)saveImageToPhotosAlbum將導(dǎo)出的這張 圖片保存到手機(jī)相冊(cè),這里需要授權(quán)相應(yīng)的要做一些處理,比如用戶(hù)拒絕授權(quán)之后再次點(diǎn)擊需要 wx.showModal再次請(qǐng)用戶(hù)授權(quán)。基本代碼如下:(詳細(xì)源碼))

      wx.canvasToTempFilePath({
        x: 0,
        y: 0,
        width: this.data.screenWidth,
        height: this.data.screenHeight,
        destWidth: this.data.screenWidth * this.data.pixelRatio,  // pixelRatio為設(shè)備的像素比  
        destHeight: this.data.screenHeight * this.data.pixelRatio,
        canvasId: "canvasid",
        success: function(e) {
          console.log(e)
          this.setData({
            bjtempFilePath: e.tempFilePath  // 拿到要保存的圖片路徑
          }, function() {});
        },
        fail: function(e) {
          console.log(e);
        }
      })
  onUserSaveImageRight: function () {
    console.log("-click-");
    var _this = this;
    if (!wx.saveImageToPhotosAlbum) return wx.showModal({
      title: "提示",
      content: "當(dāng)前微信版本過(guò)低,無(wú)法使用該功能,請(qǐng)升級(jí)到最新微信版本后重試。"
    }), void console.log("version low");
    wx.getSetting({
      success: function (res) {
        res.authSetting["scope.writePhotosAlbum"] ? (console.log("1-已經(jīng)授權(quán)《保存圖片》權(quán)限"), _this.saveimgfn()) : wx.authorize({
          scope: "scope.writePhotosAlbum",
          success: function () {
            console.log("用戶(hù)對(duì)相冊(cè)-授權(quán)成功"), _this.saveimgfn();
          },
          fail: function () {
            wx.showModal({
              title: "提示",
              content: "請(qǐng)您授權(quán)保存到系統(tǒng)相冊(cè)",
              showCancel: !1,
              success: function (res) {
                res.confirm && wx.openSetting({
                  success: function (res) {
                    res.authSetting["scope.writePhotosAlbum"] ? setTimeout(function () {
                      _this.saveimgfn();
                    }, 500) : wx.showModal({
                      title: "提示",
                      content: "您未授權(quán),無(wú)法將海報(bào)保存到相冊(cè),你可以截屏得到海報(bào),或者再次點(diǎn)擊"保存海報(bào)"按鈕并授權(quán)",
                      showCancel: !1
                    });
                  }
                });
              }
            });
          }
        });
      }
    });
  },
  saveimgfn: function () {
    var filePath = this.data.bjtempFilePath;
    console.log(filePath), filePath ? wx.saveImageToPhotosAlbum({
      filePath: filePath,
      success: function (res) {
        wx.showToast({
          title: "保存成功",
          icon: "success",
          duration: 1500
        });
      },
      fail: function () {
        wx.showToast({
          title: "保存失敗",
          icon: "fail",
          duration: 1500
        });
      }
    }) : this.saveImage()
三、極客時(shí)間小程序-生成各種海報(bào)的解決方案 微信小程序canvas與HTM5的canvas對(duì)比

微信小程序canvas中層級(jí)z-index失效,小程序中canvas擁有最高級(jí),無(wú)法二次設(shè)置;

微信小程序canvas不支持字體功能,特殊字體只能用圖片代替;

微信小程序canvas不支持繪制在線(xiàn)圖片,需要下載再繪制(安全域名的鍋)

微信小程序canvas可以實(shí)現(xiàn)不同尺寸屏幕自適應(yīng)

    var rpx;
    //獲取屏幕寬度,獲取自適應(yīng)單位
    wx.getSystemInfo({
      success: function(res) {
        rpx = res.windowWidth/750
      },
    })
    // 在繪制方法中將參數(shù)乘以相對(duì)單位即可實(shí)現(xiàn)自適應(yīng)
    const s = wx.createCanvasContext("canvas")
    s.drawImage(Url, 0, 0, 265 * rpx, 262.5 * rpx) 
如何導(dǎo)出高清海報(bào)、如何封裝;
wx.canvasToTempFilePath({
    canvasId: "image-save",
    x: 0,
    y: 0,
    success: res => {
       wx.saveImageToPhotosAlbum({
         filePath: res.tempFilePath,
         success: () => {
           this.setData({saving: false})
           utils.success("保存成功")
           setTimeout(() => {wx.navigateBack()}, 500)
         },
         fail: err => {
           this.setData({saving: false})
           wx.getSetting({
             success: res => {
               if(!res.authSetting || !res.authSetting["scrop.writePhotoAlbum"]){
                 wx.openSetting()
               }
             }
           })
         }
       })
    }
})

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98072.html

相關(guān)文章

  • 信小程序 海報(bào)生成踩坑記

    摘要:最近有個(gè)需求是要生成分享海報(bào),讓用戶(hù)可以將圖片保存到本地然后分享到朋友圈。本來(lái)以為是一個(gè)很簡(jiǎn)單的需求,可是萬(wàn)萬(wàn)沒(méi)想到,微信會(huì)這么坑。 最近有個(gè)需求是要生成分享海報(bào),讓用戶(hù)可以將圖片保存到本地然后分享到朋友圈。本來(lái)以為是一個(gè)很簡(jiǎn)單的需求,可是萬(wàn)萬(wàn)沒(méi)想到,微信會(huì)這么坑。剛開(kāi)始的思路是這樣的: 后臺(tái)根據(jù)小程序傳過(guò)來(lái)的參數(shù)獲取對(duì)應(yīng)的小程序碼,然后與背景圖合成之后將base64格式的圖片傳給小程...

    lidashuang 評(píng)論0 收藏0
  • 在微信小程序中繪制圖表(part1)

    摘要:微信小程序中提供了的支持,利用自行繪制圖表。關(guān)注我的項(xiàng)目查看完整代碼。 微信小程序中圖表現(xiàn)狀 由于微信小程序本身框架的限制,很難集成目前已有的圖表工具,顯示圖表目前有兩種方案:1、服務(wù)器端渲染圖表,輸出圖片,微信小程序中直接顯示渲染好的圖片,比如highcharts提供了服務(wù)端渲染的能力hightcharts server render,這種方式需要后臺(tái)有一套渲染服務(wù),并且有一定的網(wǎng)絡(luò)...

    chaosx110 評(píng)論0 收藏0
  • 程序如何生成海報(bào)分享朋友圈

    摘要:項(xiàng)目需求寫(xiě)完有一段時(shí)間了,但是還是想回過(guò)來(lái)總結(jié)一下,一是對(duì)項(xiàng)目的回顧優(yōu)化等,二是對(duì)坑的地方做個(gè)記錄,避免以后遇到類(lèi)似的問(wèn)題。需求利用微信強(qiáng)大的社交能力通過(guò)小程序達(dá)到裂變的目的,拉取新用戶(hù)。摘要: 小程序開(kāi)發(fā)必備技能啊... 原文:小程序如何生成海報(bào)分享朋友圈 作者:小白 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 項(xiàng)目需求寫(xiě)完有一段時(shí)間了,但是還是想回過(guò)來(lái)總結(jié)一下,一是對(duì)項(xiàng)目的回顧優(yōu)...

    lemon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<