一、Canvas應用的背景(個人理解)及基礎語法 背景 從2012年開始,微信那個時候用戶的積累的量已經非常大了,推出公眾號,當然大屏智能手機在那個時候也流行,傳統的大眾媒體逐步消亡,像微信公眾號這樣的新媒體盛行。企業的廣告投入開始從電視等傳統媒體向基于圈層文化的新媒體精準營銷轉移,甚至很多企業尤其互聯網企業開始思考如何利用用戶的自傳播這種方式去宣傳企業、實現商業目標。而用戶的自傳播很好的途徑就是生產個性化的海報。舉個最常見的例子,我第一次使用Keep是因為在朋友圈看到朋友分享她運動量的一個截圖,當時在我看來非常酷,有心率脈搏呀、時速運動量啊、消耗的卡路里等,還有一個二維碼,然后我就點了下載了Keep,這整個獲客成本幾乎為0,秒秒鐘就多了一個用戶。而實現這一過程的技術手段就可以用canvas。所以,canvas的盛行,與企業的精準營銷和用戶的自傳播有很大的關系。 如極客時間的一些實現案例: 大家看第一張圖的話是在2017年末的時候,Qcon全球軟件開發大會預熱階段的海報。然后我們為程序員做了一個生成2018年關鍵字的一張海報,文案都非常有趣啊。第二張的話是在2018年元旦的時候做的極客時間助手,這個小程序當初主要是為程序員做的2018年新年簽。那面就是一些極客時間的專欄,包括用戶留言,你留言隨手可以生成一張海報,可以轉發等等大概就是這樣。 基礎語法 Canvas本質是一個可以使用腳本(通常為JavaScript)來繪制圖形的 HTML 元素,默認大小為300像素×150像素(寬×高,像素的單位是px),通過JavaScript上下文對象動態創建圖像。比如,畫線、畫矩形、涂顏色甚至生成帶二維碼的海報。原理就是一筆一筆的畫,畫一條橫線,再畫一條橫線等等,就是不斷地創建路徑、繪制路徑,然后把這個路徑封閉起來可以涂色之類的,他的底層的封裝就是放到一個數組里形成一個路徑的數組,將這個數組傳到js底層的一個方法,然后去繪制。 舉個栗子:畫一個頭像 首先,你需要把這張圖片畫canvas上面,比如說你畫你這個頭像就是正方形,就在(0,0)開始畫一個圖片。那么你在這個圖片的中心,作為原點,然后你畫一個圓形。然后你再利用canvas語法畫一個圓弧,在這個圓弧路徑以外設置不可見以內設置可見,這個時候就形成了一個圓形頭像。 <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在語法有些區別,比如API就不一樣, // 另外小程序中的canvas因為是原生組件的層級是最高的,所以頁面中的其他組件無論設置 z-index 為多少,都無法覆蓋原生組件 </script> 二、常用的"生成海報"的方式我們會經常在朋友圈看到什么算命、性格分析、測算你的智商、情商等等這些東西,都是由用戶分享出一張圖片(海報),這個圖片就是用canvas做成的,上面畫了二維碼,二維碼是一個數組兩個或循環嵌套畫小黑點用戶識別這個二維碼之后就進入他的程序,經過程序跑出來的測試結果啊什么的,點保存的時候,就會生成一張個性海報明白。怎么生成這種個性化海報呢? 2.1 字符串模板此處應有案例
主要實現:與服務端約定好數據格式-->前端做好模板-->服務端用第三方工具渲染返回到客戶端img 2.2 canvas繪制
案例: '極客時間小助手'小程序
三、極客時間小程序-生成各種海報的解決方案微信小程序canvas與HTM5的canvas對比
如何導出高清海報、如何封裝;
|