小程序獲取頭像圖片以及昵稱(chēng)中含有emoji表情

小程序獲取頭像圖片以及昵稱(chēng)中含有emoji表情

問(wèn)題描述

1、小程序不能轉(zhuǎn)發(fā)到朋友圈返弹,所以只能通過(guò)保存圖片的方式識(shí)別二維碼進(jìn)入小程序凹联,這樣就用到了canvas畫(huà)圖,但是如果想把圖像也畫(huà)到canvas上面就需要把網(wǎng)絡(luò)圖片或者頭像圖片下載到本地緩存才能在canvas上面進(jìn)行填充赏半。小程序下載圖片或者下載頭像圖片還是比較簡(jiǎn)單的贺归,但是對(duì)于一些不明就里的還是比較坑的。畢竟小程序有安全域名這一說(shuō)断箫,真是想吐槽
2拂酣、現(xiàn)在微信的昵稱(chēng)中都含有emoji表情,顯示的時(shí)候超過(guò)一定的長(zhǎng)度要顯示...的問(wèn)題仲义,但是在畫(huà)布上如果截取的字符串正好是emoji表情婶熬,就會(huì)導(dǎo)致錯(cuò)誤。而且emoji表情是占用四個(gè)字符的埃撵,漢字占用兩個(gè)字符赵颅,英文或者特殊字符占用一個(gè)字符。也有特殊的暂刘。比如emoji表情中 中國(guó)國(guó)旗的emoji表情是占用八個(gè)字符的饺谬。所以也要根據(jù)情況判斷;

微信api

wx.downloadFile(OBJECT)
下載文件資源到本地谣拣,客戶(hù)端直接發(fā)起一個(gè) HTTP GET 請(qǐng)求募寨,返回文件的本地臨時(shí)路徑族展。
小程序downloadFileAPI
這里有一個(gè)最重要的問(wèn)題就是download的安全域名的設(shè)置。下載文件或者圖片的url的域名要在安全域名內(nèi)
比如:頭像的網(wǎng)絡(luò)地址的URL是https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLZQtgUL0YiaN3OL5RjED9zPOicjhQwcuticBWZLeGZaT5qAfqzGaBYf7vnJuKgMIycbbiavB66Tp9/132
這樣就是需要把wx.qlogo.cn添加到download的安全域名下面拔鹰。
還有一點(diǎn)要注意的就是一定要是HTTPS協(xié)議仪缸,即使是自己的圖片服務(wù)器,也一定要是HTTPS才行

設(shè)置安全域名

登陸微信公眾平臺(tái) 點(diǎn)擊設(shè)置→開(kāi)發(fā)設(shè)置→服務(wù)器域名→download服務(wù)器域名


image.png

這樣就可以下載圖片了

制作圓角信息列肢,并且畫(huà)到畫(huà)布上面

//首頁(yè)獲取圖片信息
  bindGetUserInfo: function (e) {
    app.globalData.userInfo = e.detail.userInfo;
    if (app.globalData.userInfo == null || app.globalData.userInfo == 'undefined' || app.globalData.userInfo == '' ){
      app.globalData.userImage = '';
    }else {
      wx.getImageInfo({
        src: app.globalData.userInfo.avatarUrl,    //請(qǐng)求的網(wǎng)絡(luò)圖片路徑
        success: function (res) {
          //請(qǐng)求成功后將會(huì)生成一個(gè)本地路徑即res.path,然后將該路徑緩存到storageKeyUrl關(guān)鍵字中
          app.globalData.userImage = res.path;

        },
        fail:function(res){
          app.globalData.userImage = '';
        }
      })
    }
    // this.start()
  },
//返回昵稱(chēng)的字符串恰画,超過(guò)顯示...
      //驗(yàn)證是否為emoji表情
    function BooleanEmoji(emoji) {

      var ranges = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/ig;
            return ranges.test(emoji);
      // var emojireg = emoji;
      // // return emojireg.replace(new RegExp(ranges.join('|'), 'g'), '');
      // return emojireg.replace(ranges, '');

    }
    //過(guò)濾emoji表情
    function filterEmoji(emoji){
              var ranges = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/ig;
              var emojireg = emoji;
              return emojireg.replace(ranges, '');
    }

    function GetLength(str) {
      var realLength = 0

      for (let s of str) {
        // 如果是emoji表情str_length 字符長(zhǎng)度增加4
        if (BooleanEmoji(s)) {
          realLength = realLength + 4;

        } else {
          // 如果是中文字符長(zhǎng)度增加2
          if (/.*[\u4e00-\u9fa5]+.*/.test(s)) {
            //中文字符的長(zhǎng)度經(jīng)編碼之后大于4  
            realLength = realLength + 2;
          } else {
            // 英文或者特殊字符 字符長(zhǎng)度增加2
            realLength = realLength + 1;
          }
        }
      }
      // 返回字符串的字符串總長(zhǎng)度
      return realLength;
    }

    function cutstr(str, len) {
      var str_length = 0;
      var str_len = 0;
      var str_cut = new String();
      //計(jì)算得到真正的字符串長(zhǎng)度,如果使用length會(huì)出現(xiàn)不是真正的字符串長(zhǎng)度
      str_len = Array.from(str).length;
      // 使用es6得到每個(gè)字符串
      for (let s of str) {
        // 如果是emoji表情str_length 字符長(zhǎng)度增加4
        if (BooleanEmoji(s)) {
          str_length = str_length + 4;

        } else {
          // 如果是中文字符長(zhǎng)度增加2
          if (/.*[\u4e00-\u9fa5]+.*/.test(s)) {
            //中文字符的長(zhǎng)度經(jīng)編碼之后大于4  
            str_length = str_length + 2;
          } else {
            // 英文或者特殊字符 字符長(zhǎng)度增加2
            str_length = str_length + 1;
          }
        }
        var beforeStr =s;
        // 拼接字符串
        str_cut = str_cut.concat(s);
        // 大于指定的字符長(zhǎng)度就會(huì)顯示...
        if (str_length >= len) {
          if (BooleanEmoji(s)) {
           str_cut = filterEmoji(str_cut).trim();
           if(str_cut==''){
            str_cut = '我'
           }
          }else {
            str_cut = str_cut.concat("...");
          }

          return str_cut;
        }
      }
      // 小于指定的字符長(zhǎng)度返回字符串
      if (str_length < len) {
        return str;
      }
    }

    //var nickName = '????荷葉????';
    //if(GetLength(nickName) > 16){
         //    var nickNameValue = cutstr(nickName,14) + ''
 //   }else {
    //   var nickNameValue = nickName + ''
   // }

     //console.log("表情符號(hào)是多少",nickNameValue)


    // 獲取userInfo
    var userInfo = app.globalData.userInfo;

    if (userInfo == '' || userInfo == 'undefined' || userInfo == null) {
      // var nickName = userInfo.nickName;
      var nickNameValue = ''

      // var userInfoImage = userInfo.avatarUrl;
      // console.log("userInfoImage", userInfoImage)
    } else {
      // console.log("userInfo",userInfo)
      var userInfoImage = app.globalData.userImage;

      console.log("userInfoImage", userInfoImage)
      var nickName = userInfo.nickName;

        //var nickName = '????荷葉????';

      if (GetLength(nickName) > 16) {
        //截取昵稱(chēng)第一個(gè)
        var nickNameValue = cutstr(nickName,14) + ''
      } else {
        var nickNameValue = nickName + ''
      }
    }

//畫(huà)布
var userInfoImage = app.globalData.userImage瓷马;

    const ctx = wx.createCanvasContext('qr-canvas');
       ctx.save();
        ctx.beginPath();
        // 下面是先定位要開(kāi)個(gè)圓形的位置锣尉,50 和 90 分別就是圓的圓心的 x 坐標(biāo)和 y 坐標(biāo),
//25 是半徑决采,后面的兩個(gè)參數(shù)就是起始和結(jié)束自沧,這樣就能畫(huà)好一個(gè)圓了

        ctx.arc(50,90, 25, 0, 2 * Math.PI);
        ctx.closePath();
        // 下面就裁剪出一個(gè)圓形了,且坐標(biāo)在 (50树瞭, 90)
        ctx.clip();
        // 然后畫(huà)圖片拇厢,res.tempFilePath 其實(shí)是下載到本地的一個(gè)路徑,使用小程序畫(huà)出圖片記得一定要用本地的路徑晒喷,
//可以用 wx.downloadFile 來(lái)實(shí)現(xiàn)孝偎。 因?yàn)?drawImage 的第二個(gè)和第三個(gè)參數(shù)是圖片的左上角在畫(huà)布 canvas 的 x 坐標(biāo),y 坐標(biāo)凉敲,
//所以圖片的坐標(biāo)比圓形的坐標(biāo)分別都小圓的半徑大小就剛剛好能被切成圓形衣盾,后面的兩個(gè)參數(shù)就是圖片的寬和高,請(qǐng)?jiān)O(shè)定為圓形的直徑長(zhǎng)度爷抓。
//userInfoImage是下載的圖片信息势决;
        ctx.drawImage(userInfoImage, 25, 75, 50, 50);
        ctx.restore();
//nickNameValue是昵稱(chēng)信息
        // 計(jì)算昵稱(chēng)的寬度
        //計(jì)算第一個(gè)設(shè)置大小之后的長(zhǎng)度
        ctx.setFontSize(18)
        ctx.setFillStyle('black');
        // var nickNameWidthOne = ctx.measureText(nickNameValue).width
        // 設(shè)置昵稱(chēng)的位置
        ctx.fillText(nickNameValue,90,75)

javascript有一個(gè)Unicode天坑 | 騰訊
字符的 Unicode 表示法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蓝撇,隨后出現(xiàn)的幾起案子果复,更是在濱河造成了極大的恐慌,老刑警劉巖渤昌,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虽抄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡独柑,警方通過(guò)查閱死者的電腦和手機(jī)迈窟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忌栅,“玉大人车酣,你說(shuō)我怎么就攤上這事。” “怎么了骇径?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)者春。 經(jīng)常有香客問(wèn)我破衔,道長(zhǎng),這世上最難降的妖魔是什么钱烟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任晰筛,我火速辦了婚禮,結(jié)果婚禮上拴袭,老公的妹妹穿的比我還像新娘读第。我一直安慰自己,他們只是感情好拥刻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布怜瞒。 她就那樣靜靜地躺著,像睡著了一般般哼。 火紅的嫁衣襯著肌膚如雪吴汪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天蒸眠,我揣著相機(jī)與錄音漾橙,去河邊找鬼。 笑死楞卡,一個(gè)胖子當(dāng)著我的面吹牛霜运,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒋腮,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淘捡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了池摧?” 一聲冷哼從身側(cè)響起案淋,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎险绘,沒(méi)想到半個(gè)月后踢京,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宦棺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年瓣距,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代咸。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹈丸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逻杖,我是刑警寧澤奋岁,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站荸百,受9級(jí)特大地震影響闻伶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜够话,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一蓝翰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧女嘲,春花似錦畜份、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至愕鼓,卻和暖如春顶别,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拒啰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工驯绎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谋旦。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓剩失,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親册着。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拴孤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容