9月24號朋友圈,這一波愛國風,一切換國慶專屬頭像的活動,應該是卷席各位老鐵的朋友圈,做爲程序員,代碼源於生活,筆者稍微手一癢,就想了一下原理是很簡單的,因而乎,本身擼一個製做「國慶頭像」的小程序來~,目前只是一個小demo,效果以下圖(UI基本上搬騰訊新聞原版活動界面),不少功能也因爲微信API調用須要的config配置,未提供實現代碼,基於 Vue2.6x 構建的項目,源碼碼能夠移步至前端
9月24號一大早,估計不少人的朋友圈是這樣的:vue
騰訊新聞官方推出「迎國慶換新顏」活動 ,可領取你的國慶專屬頭像,包括70記念徽章、小國旗,不過僅僅一天官方就關閉了活動。git
接下來咱們,就本身擼一個,上車程序員
其實咱們看頁面的話,內容很簡單,就是一個輪播圖切換國慶背景的邊框,而後點擊保存,其實,這裏是涉及Canvas知識點,大概能夠分紅如下幾步:github
一、獲取或者上傳微信頭像
二、Canvas實現繪圖和頭像合成: Canvas實現定位繪圖,以及兩張圖片的合成
三、保存合成的圖片 將圖片轉換爲base64,保存頭像npm
本項目是基於 Vue2.6x 構建的項目canvas
第一步、佈局切圖
這是最基礎的前端技能,就略了,這裏主要就是一個輪播圖的實現,在本項目中,我把這個拆一個輪播組件,目前寫的是沒有過渡動畫特效的(有興趣的同窗能夠優化一下,加點切換動畫),以下圖小程序
目錄components/slideshow.vueapi
<template> <div class="slideshow-warpper"> <div class="img-warpper"> <div class="border-img"> <img :src="borderImgList[nowIndex].src" ref="isBorderImg" /> </div> <div class="head-img"> <img :src="headImg" ref="isHeadImg" /> </div> </div> <div class="btn" @click="goto(prevIndex)"></div> <div class="btn next" @click="goto(nextIndex)"></div> </div> </template> <script> export default { name: "slideshow", props: ["borderImgList", "headImg"], data() { return { nowIndex: 0, selectBorderImg: this.borderImgList[0].src }; }, methods: { goto(index) { this.nowIndex = index; this.selectBorderImg = this.borderImgList[index].src; } }, computed: { prevIndex() { if (this.nowIndex === 0) { return this.borderImgList.length - 1; } else { return this.nowIndex - 1; } }, nextIndex() { if (this.nowIndex === this.borderImgList.length - 1) { return 0; } else { return this.nowIndex + 1; } } } }; </script>
這裏代碼很平淡,主要就是一個數組背景邊框爲背景,而後循環切換。這邊的邏輯比較簡單,數組
值得一提的是,vue關於src圖片的坑,想必不少人都會遇到,就是正常img里加src="變量",這樣是不會顯示
舉個例子,父組件傳來的一個圖片的URL,若是你子組件
URL = '/assets/border1.png' <img :src="URL" />
這樣是不顯示的
可是你在子組件裏直接,是能夠正常加載圖片的
<img :src="/assets/border1.png" />
這時候解決辦法,一般就是加個 require(),例如
headImg: require("../assets/test.jpg"),
第二步、canvas合成圖片
這裏就是涉及到一些簡單的canvas標籤的運用
一、首先咱們要建立一個canvas元素,建立canvas繪圖的環境,設置畫布長寬
二、把利用drawImage方法(詳細的能夠移步)兩張照片繪製合成一張照片
三、設置圖片返回的格式,HTMLCanvasElement.toDataURL() 方法
save() { let slideshowChild = this.$refs.slideshowChild.$refs; let canvas = document.getElementById("myCanvas"); let ctx = canvas.getContext("2d"); canvas.width = 150; canvas.height = 150; ctx.drawImage(slideshowChild.isHeadImg, 0, 0, 150, 150); ctx.drawImage(slideshowChild.isBorderImg, 0, 0, 150, 150); let urlSrc = canvas.toDataURL("img/png"); this.showCanvas = true; console.log(urlSrc); // wx.saveImageToPhotosAlbum({ // filePath: urlSrc // }); },
接下來
咱們拿一張圖片作測試ok的。
這塊涉及到微信weixin-js-sdk,在項目中安裝它
npm install weixin-js-sdk
接下來由於當用戶從微信一進入頁面須要受權獲取用戶信息,這裏不管是 微信網頁開發,仍是小程序開發都涉及到受權,具體而言,網頁受權流程分爲四步:
一、引導用戶進入受權頁面贊成受權,獲取code
二、經過code換取網頁受權access_token(與基礎支持中的access_token不一樣)
三、若是須要,開發者能夠刷新網頁受權access_token,避免過時
四、經過網頁受權access_token和openid獲取用戶基本信息(支持UnionID機制)
這裏就能獲取到微信頭像
固然這就須要你本身在微信公衆平臺申請一個帳號,筆者這裏因爲我的公衆號和小程序的開發帳號,都過久沒玩,被凍結了,後面補全這些功能
上傳圖片,保存這些都有API能夠現成的用咯
本項目裏在/api/sdk.js,有部分封裝
文章寫到這裏,基本告一段落了,看起來這麼火的活動,背後實際上是能夠用這麼簡單的代碼實現的,代碼源於生活,嘿嘿,是否是頗有趣,目前微信sdk相關的部分代碼未上傳,能夠給各位老鐵,自行下載去玩,固然我也會盡快補全。國慶到了,祝各位老鐵,國慶快樂呀~