一级片大奶子_色又黄又爽18禁免费视频_热久久久久久久_久久久精品一区二区_日韩av不卡在线播放_精品国内自产拍在线观看视频

注冊(cè)登錄

微信小程序使用canvas繪圖生成個(gè)性化海報(bào)

2020-09-28
導(dǎo)讀:一、Canvas應(yīng)用的背景(個(gè)人理解)及基礎(chǔ)語法背景 從2012年開始,微信那個(gè)時(shí)候用戶的積累的量已經(jīng)非常大了,推出公眾號(hào),當(dāng)然大屏智能手機(jī)在那個(gè)時(shí)候也流行,傳統(tǒng)的大眾媒體逐步消亡...
一、Canvas應(yīng)用的背景(個(gè)人理解)及基礎(chǔ)語法背景

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

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

基礎(chǔ)語法

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

微信小程序使用canvas繪圖生成個(gè)性化海報(bào)

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

  <canvas id="canvas" width="300" height="300"></canvas>
  <script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    const img = new Image()
    img.onload = function() {
      circleImg(ctx, img, 100, 100, 50)
    }
    img.src="https://avatar-static.segmentfault.com/289/811/2898115528-58c35e9b79717_big64"
    function circleImg(ctx, img, x, y, r) {
      ctx.save()
      let d = 2 * r
      let cx = x + r
      let cy = y + r
      ctx.arc(cx, cy, r, 0, 2 * Math.PI)
      ctx.stroke();
      ctx.clip()
      ctx.drawImage(img, x, y, d, d)
      ctx.restore()
    }
    // 微信小程序中的[canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html)與HTML5的canvas在語法有些區(qū)別,比如API就不一樣,
    // 另外小程序中的canvas因?yàn)槭窃M件的層級(jí)是最高的,所以頁面中的其他組件無論設(shè)置 z-index 為多少,都無法覆蓋原生組件
  </script>
二、常用的"生成海報(bào)"的方式

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

2.1 字符串模板

此處應(yīng)有案例

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

2.2 canvas繪制

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

第一部分:小商店是什么

第二部分:如何開通一個(gè)小商店

第三部分:如何登錄小商店

第四部分:開店任務(wù)常見問題

第五部分:小商店可以賣什么

第六部分:HiShop小程序特色功能

第七部分:小程序直播

第八部分:小程序收貨/物流

第九部分:小程序怎么結(jié)算

第十部分:小程序客服

第十一部分:電商創(chuàng)業(yè)

第十二部分:小程序游戲開發(fā)

電話咨詢 微信咨詢 預(yù)約演示 0元開店
主站蜘蛛池模板: 精品精品在线视频|男女18禁啪啪无遮挡|国产一二三区精品视频|yy6080午夜|天天操综合网站|久久免费精品视频 | 青青草手机视频在线|天天看天天草|新久草视频|中文字幕在线亚洲三区|国产成人啪精品视频免费网|国产精品原创=aV片国产安全 | 东京热TOKYO综合久久精品|99ri=av国产精品|欧美日本韩国一区二区三区|色综合久|麻豆精产国品一二三产区|97视频在线观看免费 | 一本到亚洲网|99久久精品国产欧美主题曲|973理论片235影院|国产一区二区高清在线|亚州国产视频|国产精品一卡二卡三卡 | 色综合区|日本免费三片免费观看东热|99re免费精品视频|97在线观看免费观看|超碰超在线|色36cccwww在线播放 | 国内精品久久国产|国产一区二区三区内射高清|一二三四视频在线社区中文字幕2|大地资源在线观看中文免费|午夜精品免费观看|无码成人18禁动漫网站 | 日韩精品三区|国产成人精品=a视频免费福利|色中色综合|国产成人精品一区二区三区四区|国产一级毛片精品完整视频版|国产字幕在线看 | 成人极品影院|久久综合亚洲色hezyo国|www.在线视频|奇米777四色精品综合影院|土壤污染状况调查|人人草人人插 | 一本一道波多野毛片中文在线|久久久久久久久久亚洲精品|高潮又爽又黄又无遮挡免费软件|57p=ao国产成永久免费视频|在线国产欧美|九草=av | 国产乱妇乱子在线播视频播放网站|国产免费人成在线视频|精品欧洲=av无码一区二区14|精品少妇一区二区三区在线观看|播放一区二区|国产精品久久久久久久久无码日本蜜乳 | 国产精品成人v=a在线观看|久久网中文字幕|国产精品2区|色费色情人成视频|国产精品一区二区丝瓜|国产亚洲精品自在久久77 | 美女视频黄=a视频免费全程软件=axs|忘忧草在线影院两性视频|久久人妻内射无码一区三区|亚洲精品一区在线观看|日韩精品国产一区二区|中文字幕久精品免 | 免费观看=a级毛片在线播放|特极毛片|男男做爰猛烈叫床视频gv|亚洲日本在线在线看片4k超清|一级黄色免费观看视频|亚洲第一福利网站在线观看 | 白浆视频在线观看|亚洲国产欧美一区二区三区|一二三四在线观看免费高清视频|国产又黄又爽又刺激的免费网址|免费观看成人毛片=a片入口少|美女亚洲网 | 天天操天天爱天天干|日本中文字幕免费在线观看|国产精品久久毛片=a片软件爽爽|国产精品色=av|中文字幕第二十一页|日本护士大口吞精视频网站 | hh99me福利毛片|18国产精品白浆在线观看免费|无码午夜人妻一区二区三区不卡视频|免费看无码自慰一区二区|亚洲一区二区卡|天天操天天艹 | 亚洲精品久久久久一区二区|啊灬啊灬啊灬快灬高潮了视频网站|国产妇女野外牲一级毛片|两个人的房间高清在线观看|国产chinese男男G=aYG=aY视频网站|日本=aⅴ毛片成人偷拍 | #NAME?|国产12页|精品视频一区在线视频|#NAME?|国产污网站在线观看|在线在线ccc66 | 999精品视频一区二区三区|内射一区二区精品视频在线观看|成人无码区免费=a∨|狠狠操五月天|久久亚洲一区二区三区成人国产|日韩欧无码一区二区三区免费不卡 | 丁香花在线影院观看在线播放|成人网页在线|日本一码二码三码在线|偷拍25位美女撒尿bbb片户外|十八禁韩国女主播vip秀362视频|色哺乳xxxxhd国产 | #NAME?|青青草在线视频免费观看|久草免费福利|日日噜噜夜夜狠狠爱视频免费樱桃|国产精品一级=a级理论片在线观看|亚洲狠狠色综合蜜桃 | 国产V精品无码好舒服欧美精品|一本之道亚洲|亚在线观看免费视频入口|成人学院中文字幕|国产精品成人观看视频网站|欧洲成在人线视频免费 | 色播六月天|色综合久久久久久久久久|国产精品久久久久不卡绿巨人|国产精品视频一区国模私拍|久久婷综合|精品麻豆剧传媒=av国产 | 12一14幻女bbwxxxx在线播放|自拍偷拍第5页|成人小视频免费看|在线看黄色片|亚洲精品国产品国语在线观看|欧美中文字幕在线视频 | 亚洲啪啪|麻豆视传媒短视频免费官网|成人啪啪178|一区二区三区四区高清精品免费观看|日本一区二区三区免费看|久草视频免费播放 | 亚洲国产精品无码第一区二区三区|十大免费最污的软件|玖玖99视频|激情动漫在线观看|#NAME?|蝌蚪视频窝在线播放 | 成人无码区免费=aⅴ片www老师|男人天堂网址|国产一片|国产第一福利影院|一本久道中文无码字幕=av|毛片视频播放 | 国产高清在线看|奶头好大揉着好爽视频|www超碰|女人天堂=av在线|久久久久久久久久一级|99国产精品粉嫩初高生在线播放 | 精品国产96亚洲一区二区三区|水蜜桃综合久久无码欧美|国产精品久久久久久久第一福利|成人无码免费视频在线观看网址|伊人wwwyiren22cn|极品尤物被啪到呻吟喷水 | 精品视频在线一区二区在线|码亚洲中文无码=av在线|九九九国产精品成人免费视频|国产露脸对白88=av|天天艹日日干|中文字幕久久精品一二三区 | 在线观看免费v=a|国产久一|日本亚洲三级|c=aowo88国产欧美久久|能免费看的=av|97热精品视频官网 | 色综合区|日本免费三片免费观看东热|99re免费精品视频|97在线观看免费观看|超碰超在线|色36cccwww在线播放 | 少妇精品|欧美大逼视频|一级做=a爱片特黄在线观看|日本乱码伦视频免费播放|亚洲精品在线观看=av|久久久久久久久久久久久久=av | 未满成年国产在线观看|99爱精品|#NAME?|免费成人=av网|麻豆911|精品国产综合区久久久久久 | 最新中文乱码字字幕在线|亚洲色无码中文字幕|久久久精品免费网站|高潮毛片无遮挡高清视频播放|欧美黄色一级带|国产操女人 | 惊弦45集免费看|亚洲精品九一|教师学生毛片一区二区三区|男人女人真曰批的视频|牛牛精品专区在线|国产一区二三区 | 亚洲免费永久|91看片网址|亚洲=aV片毛片成人观看|国产精品视频内|在线=a=a=a|国产美女主播一级成人毛片 | 四虎影视永久|国产精品专区在线|日本69熟|亚洲高清=av在线|国产精品污www在线观看17c|与子敌伦刺激对白播放 | 一区二区三区日韩视频在线观看|日韩欧美在线观看一区|91精品一区二区三区久久|FREEZEFR=aME丰满人妻|亚洲=aV无码一区二区二三区|欧美综合区自拍亚洲综合绿色 | 巜豪妇荡乳2在线观看|又粗又硬进去好爽=a片视频野花|6969成人亚洲婷婷|99视频免费播放|97国产在线播放第一页|人人人澡人人人妻人人人少妇 | 91精品国产综合久久久欧美|色一情一乱一乱一区99=av|国产一区二区小视频|稚嫩小奶娃h文|一级毛片免费观看视频|日本无遮挡边做边爱边摸 |