開發微信一鍵製做「國慶頭像」小工具,比你@微信官方靠譜多了【基於 Vue2.6x 構建】

1、寫在前面:

9月24號朋友圈,這一波愛國風,一切換國慶專屬頭像的活動,應該是卷席各位老鐵的朋友圈,做爲程序員,代碼源於生活,筆者稍微手一癢,就想了一下原理是很簡單的,因而乎,本身擼一個製做「國慶頭像」的小程序來~,目前只是一個小demo,效果以下圖(UI基本上搬騰訊新聞原版活動界面),不少功能也因爲微信API調用須要的config配置,未提供實現代碼,基於 Vue2.6x 構建的項目,源碼碼能夠移步至
html


2、前情回顧:

9月24號一大早,估計不少人的朋友圈是這樣的:前端


騰訊新聞官方推出「迎國慶換新顏」活動 ,可領取你的國慶專屬頭像,包括70記念徽章、小國旗,不過僅僅一天官方就關閉了活動。vue

接下來咱們,就本身擼一個,上車html5

3、簡析實現原理

其實咱們看頁面的話,內容很簡單,就是一個輪播圖切換國慶背景的邊框,而後點擊保存,其實,這裏是涉及Canvas知識點,大概能夠分紅如下幾步:git

  • 一、獲取或者上傳微信頭像
  • 二、Canvas實現繪圖和頭像合成: Canvas實現定位繪圖,以及兩張圖片的合成
  • 三、保存合成的圖片 將圖片轉換爲base64,保存頭像


4、構建項目

本項目是基於 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元素,建立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的。




5、獲取或者上傳頭像

這塊涉及到微信weixin-js-sdk,在項目中安裝它

npm install weixin-js-sdk複製代碼

接下來由於當用戶從微信一進入頁面須要受權獲取用戶信息,這裏不管是 微信網頁開發,仍是小程序開發都涉及到受權,具體而言,網頁受權流程分爲四步:

一、引導用戶進入受權頁面贊成受權,獲取code

二、經過code換取網頁受權access_token(與基礎支持中的access_token不一樣)

三、若是須要,開發者能夠刷新網頁受權access_token,避免過時

四、經過網頁受權access_token和openid獲取用戶基本信息(支持UnionID機制)

這裏就能獲取到微信頭像

固然這就須要你本身在微信公衆平臺申請一個帳號,筆者這裏因爲我的公衆號和小程序的開發帳號,都過久沒玩,被凍結了,後面補全這些功能

上傳圖片,保存這些都有API能夠現成的用咯

本項目裏在/api/sdk.js,有部分封裝


5、最後

文章寫到這裏,基本告一段落了,看起來這麼火的活動,背後實際上是能夠用這麼簡單的代碼實現的,代碼源於生活,嘿嘿,是否是頗有趣,目前微信sdk相關的部分代碼未上傳,能夠給各位老鐵,自行下載去玩,固然我也會盡快補全。國慶到了,祝各位老鐵,國慶快樂呀~

[源碼地址傳送門]

相關文章
相關標籤/搜索