9月24號朋友圈,這一波愛國風,一切換國慶專屬頭像的活動,應該是卷席各位老鐵的朋友圈,做爲程序員,代碼源於生活,筆者稍微手一癢,就想了一下原理是很簡單的,因而乎,本身擼一個製做「國慶頭像」的小程序來~,目前只是一個小demo,效果以下圖(UI基本上搬騰訊新聞原版活動界面),不少功能也因爲微信API調用須要的config配置,未提供實現代碼,基於 Vue2.6x 構建的項目,源碼碼能夠移步至
html
9月24號一大早,估計不少人的朋友圈是這樣的:前端
騰訊新聞官方推出「迎國慶換新顏」活動 ,可領取你的國慶專屬頭像,包括70記念徽章、小國旗,不過僅僅一天官方就關閉了活動。vue
接下來咱們,就本身擼一個,上車html5
其實咱們看頁面的話,內容很簡單,就是一個輪播圖切換國慶背景的邊框,而後點擊保存,其實,這裏是涉及Canvas知識點,大概能夠分紅如下幾步:git
本項目是基於 Vue2.6x 構建的項目程序員
這是最基礎的前端技能,就略了,這裏主要就是一個輪播圖的實現,在本項目中,我把這個拆一個輪播組件,目前寫的是沒有過渡動畫特效的(有興趣的同窗能夠優化一下,加點切換動畫),以下圖github
目錄components/slideshow.vue
npm
<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>複製代碼
這裏代碼很平淡,主要就是一個數組背景邊框爲背景,而後循環切換。這邊的邏輯比較簡單,canvas
值得一提的是,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繪圖的環境,設置畫布長寬
二、把利用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相關的部分代碼未上傳,能夠給各位老鐵,自行下載去玩,固然我也會盡快補全。國慶到了,祝各位老鐵,國慶快樂呀~