亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

詳解html5 canvas 微信海報分享(個人爬坑)

2024-08-26 00:20:20
字體:
來源:轉載
供稿:網友

本文介紹了canvas 微信海報分享,分享給大家,具體如下:

  1. 隨機產生一張圖片
  2. 拿到微信用戶的頭像和稱呢(自己調后端的接口獲?。?/li>
  3. 把用戶頭像和稱呢和隨機產生一張圖片合成一張海報
  4. 可能上一頁用戶還有填入的心愿文本也要填入圖片中

canvas,微信海報,canvas生成微信海報

實現效果圖

canvas,微信海報,canvas生成微信海報

記錄下在實現功能過程中遇到的問題

  1. canvas在微信瀏覽器中長按無效不能像img一樣長按分享(那我就轉成img唄)
  2. 轉成img后在微信開發者工具中能顯示,真機無效(欲哭無淚),度娘說可能是圖片跨域^-^
  3. 用戶頭像合成還要圓角,我表示不會啊,直接看canvas api文檔了對度娘無愛了
  4. canvas填入文字超過指定寬度也要換行,我表示只知道不超多指定寬度的各種文字對齊方式 ctx.textAlign = 'center' ;
  5. canvas在高清屏下模糊的問題(超簡單的不知道度娘怎么會那么啰嗦)不就是canvas.witdt=innerWidth*devicePixelRatio

HTML結構

<div class="imgBox" v-cloak>    <img :src='imgSrc' v-if="imgSrc" /></div>

CSS

<style>    *{        margin:0;        padding:0;    }    body,    html {        width: 100%;        height: 100%;    }    .imgBox {        width: 100%;        height: 100%;    }    img {        width: 100%;        display: block;    }</style>

script

// js主要結構new Vue({    el:'imgBox',    data:{        urlParam: {},//獲取url中的傳值對象        randomNum: 1,//隨機數用于確定那個祈福頁        userName: '',//用戶稱呢        imgSrc: '',//合成最終圖片        userImg: '',//用戶頭像圖片        userMessage: '',//用戶留言    },    methods: {        // 分享到盆友圈        wxShareFriends: function () {},        // 初始化請求頭        wxHttp: function () {            $.ajaxSetup({                headers: {                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')                }            });        },        // 獲取隨機數[1,10]        randomNumbers() {            this.randomNum = Math.ceil(Math.random() * 10)        },        // 獲取微信用戶頭像和稱呢和用戶輸入祝福語        getUserInfo() {            var vm = this;            $.post('API請求地址', function (data) {                if (data.code == 1) {                    vm.userImg = data.data.headimg;                    vm.userName = data.data.nickname;                    if (vm.randomNum % 2 == 0) {                        vm.userMessage= '紅塵相遇,年華已老。歲月花開多少不在,古往今來相遇是一件既微妙。而又神圣的事情,紅塵的情網中'                    } else {                        vm.userMessage = '紅塵相遇,年華已老'                    }                }                vm.$nextTick(function () {                    vm.drawCanvasBgImg();                })            })        },        // 獲取頁面dpr和寬度        getWindowInfo() {            var windowInfo = {};            windowInfo.dpr = window.devicePixelRatio;            if (window.innerWidth) {                windowInfo.width = window.innerWidth;            }            else {                windowInfo.width = document.body.clientWidth;            }            return windowInfo;        },        // 畫活動頁分享背景大圖        drawCanvasBgImg () {},        // 在背景圖片的畫布上截取一個圓然后填充入用戶頭像        drawCanvasUserImg(canvas, ctx, dpr) {},        // 填寫用戶稱呢或者用戶留言        canvasFillText (canvas, ctx, dpr, circleR) {},        // 合成base64位分享圖        convertCanvasToImage (canvas) {            this.imgSrc = canvas.toDataURL("image/jpeg");//png有毒在安卓機下識別二維碼無法跳轉            this.$Spin.hide();        }    }})

畫圖方法步驟

  1. drawCanvasBgImg ()
  2. drawCanvasUserImg (canvas, ctx, dpr)
  3. canvasFillText (canvas, ctx, dpr, circleR)
  4. convertCanvasToImage (canvas)

畫活動頁分享背景大圖 drawCanvasBgImg ()

//拿到數據后開始畫背景大圖 想法很簡單就是把圖片畫到canvas中然后在畫布上再畫頭像文字讓后轉成img drawCanvasBgImg () {    var vm = this;    var canvas = document.createElement("canvas");    var ctx = canvas.getContext("2d");    var clientWidth = this.getWindowInfo().width;  //獲取屏幕寬度用于canvas寬度自適應移動端屏幕    var dpr = this.getWindowInfo().dpr;    ctx.globalCompositeOperation = "source-atop";//** 坑鋸齒感覺沒什么用不知道是不是用錯地方了 **    canvas.width = dpr * clientWidth;  //由于手機屏幕時retina屏,都會多倍渲染,用dpr來動態設置畫布寬高,避免圖片模糊    canvas.height = dpr * clientWidth * 609 / 375;//去掉微信頭部的狀態欄應該是603 沒搞懂603還是不能讓圖片滿屏直接多加到了609    var img = new Image();    img.crossOrigin = '';//死坑的圖片跨域 (img.crossOrigin = "Anonymous"這種寫法還是不能顯示base64格式圖片)    img.src = "http://xxx" + this.randomNum + ".jpg";    img.onload = function () {        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);        vm.drawCanvasUserImg(canvas, ctx, dpr);    }},

用戶頭像 drawCanvasUserImg (canvas, ctx, dpr)

// 在背景圖片的畫布上截取一個圓然后填充入用戶頭像drawCanvasUserImg: function (canvas, ctx, dpr) {    var vm = this;    var circleR = 50 * dpr;//半徑    var circleX = canvas.width / 2;//圓心X坐標    var circleY = 50 * dpr;//圓心Y坐標    var imgX = circleX - circleR;//圖片X開始坐標    var imgY = circleY - circleR;//圖片Y開始坐標    var imgWidth = 2 * circleR;//圖片按圓形大小    var img = new Image();    img.crossOrigin = '';    img.src = this.userImg;    img.onload = function () {        ctx.save(); // 保存當前ctx的狀態        ctx.arc(circleX, circleY, circleR, 0, 2 * Math.PI); //畫出圓        ctx.clip(); //裁剪上面的圓形        ctx.drawImage(img, imgX, imgY, imgWidth, imgWidth); // 在剛剛裁剪的園上畫圖        ctx.restore(); // 還原狀態        vm.canvasFillText(canvas, ctx, dpr, circleR);    }},

在canvas中畫文字

// 填寫用戶稱呢或者用戶留言canvasFillText (canvas, ctx, dpr, circleR) {    var fontSizeThis = dpr * 20 + 'px' + ' Arial';    var userNameY = 0;//用戶名Y軸坐標    var userMessageX = dpr * 40;//用戶留言X軸坐標    var userMessageY = 0;//用戶留言Y軸坐標    var lastSubStrIndex = 0;//字符串下標    var lineWidth = 0;//一行寬度    var allTextWidth = 0;//所有字符寬度    ctx.font = fontSizeThis;    // 需要用戶名是寫入用戶名    if (this.userName) {        userNameY = circleR * 2.5;        ctx.fillStyle = "#0094ff";        ctx.textAlign = 'center';        ctx.fillText(this.userName, canvas.width / 2, userNameY);    }    if (this.userMessage) {        userMessageY = userNameY + dpr * 35;        ctx.fillStyle = "#000";        // 獲取字符寬度        for (var i = 0; i < this.userMessage.length; i++) {            allTextWidth += ctx.measureText(this.userMessage[i]).width;        }        // 字符串長度大于畫布區域要換行        if (allTextWidth > canvas.width - 2* userMessageX) {            for (var i = 0; i < this.userMessage.length; i++) {                lineWidth += ctx.measureText(this.userMessage[i]).width;                if (lineWidth > canvas.width - 2*userMessageX) {                    ctx.textAlign = 'left';                    ctx.fillText(this.userMessage.substring(lastSubStrIndex, i), userMessageX, userMessageY);                    userMessageY += dpr * 25;//設置行高                    lineWidth = 0;                    lastSubStrIndex = i;                }                if (i == this.userMessage.length - 1) {                    ctx.fillText(this.userMessage.substring(lastSubStrIndex, i + 1), userMessageX, userMessageY);                }            }        } else {            // 小于者居中顯示            ctx.textAlign = 'center';            ctx.fillText(this.userMessage, canvas.width / 2, userMessageY);        }    }    this.convertCanvasToImage(canvas);},

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲视频在线| 亚洲精品aⅴ中文字幕乱码| 久久精品亚洲94久久精品| 亚洲高清免费观看高清完整版| 国产精品亚洲网站| 午夜精品一区二区三区在线视频| 亚洲欧美日韩国产成人| 亚洲色图日韩av| 欧美洲成人男女午夜视频| 国内精品视频久久| 日本精品视频在线观看| 97视频在线播放| 欧美激情中文字幕在线| 日韩一区二区三区国产| 亚洲第一网站男人都懂| 亚洲嫩模很污视频| 色婷婷综合成人| 久久久免费高清电视剧观看| 亚洲精品欧美日韩专区| 欧洲亚洲在线视频| 国产美女精彩久久| 久久国产精品偷| 精品久久久久久电影| 欧美日韩亚洲成人| 国产精品一久久香蕉国产线看观看| 日韩欧美高清在线视频| 欧美日韩高清在线观看| 国产精品麻豆va在线播放| 国产一区二区三区三区在线观看| 在线视频日本亚洲性| 成人精品在线观看| 亚洲国产精品国自产拍av秋霞| 国产精品视频自拍| 国产精品久久久久久一区二区| 亚洲天堂第一页| 亚洲免费福利视频| 成人美女免费网站视频| 久久久黄色av| 久久久久久久久国产| 亚洲专区中文字幕| 亚洲欧洲高清在线| 欧美在线视频免费| 成人久久一区二区三区| 国产美女精品视频| 日韩在线免费视频观看| 欧美激情一区二区三区高清视频| 亚洲精美色品网站| 久久久久国产精品www| 国产亚洲综合久久| 8x海外华人永久免费日韩内陆视频| 日韩a**中文字幕| 久久五月天综合| 国产成人小视频在线观看| 77777少妇光屁股久久一区| 成人亚洲激情网| 91精品在线播放| 亚洲精品之草原avav久久| 精品久久久av| 国产在线日韩在线| 亚洲男人天堂网| 91av视频在线观看| 亚洲欧洲日本专区| 欲色天天网综合久久| 91久久嫩草影院一区二区| 韩剧1988在线观看免费完整版| 久久这里只有精品视频首页| 久久久欧美精品| 久久99精品久久久久久青青91| 亚洲视频在线免费观看| 亚洲国产婷婷香蕉久久久久久| 亚洲人成欧美中文字幕| 日韩欧美高清视频| 亚洲精品丝袜日韩| 成人福利在线观看| 久久综合伊人77777尤物| 欧美大成色www永久网站婷| 亚洲欧美制服第一页| 日韩一区二区精品视频| 亚洲综合一区二区不卡| 久久精品99无色码中文字幕| 日韩精品一区二区三区第95| www.日韩.com| 欧美一区二区影院| 国产精品男人爽免费视频1| 国产成人精品电影| 国产成一区二区| 久久久久久噜噜噜久久久精品| 午夜精品一区二区三区在线视| 日韩福利在线播放| 日本sm极度另类视频| 国产精品美女主播在线观看纯欲| 亚洲视频在线免费看| 97久久超碰福利国产精品…| 国产视频在线一区二区| 欧美裸体xxxx极品少妇软件| 欧美天堂在线观看| 国产精品久久久久久久app| 色99之美女主播在线视频| 国产香蕉一区二区三区在线视频| 亚洲91精品在线观看| 国产999在线| 伊人伊成久久人综合网小说| 米奇精品一区二区三区在线观看| 国产精品色悠悠| 欧美孕妇性xx| 久久精品这里热有精品| 91成人性视频| 青草青草久热精品视频在线观看| 成人在线视频网站| 久久久久久一区二区三区| 欧美性猛xxx| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美精品做受xxx性少妇| 国产精品女主播| 色视频www在线播放国产成人| 亚洲精品综合久久中文字幕| 国产亚洲欧洲高清一区| 欧美激情图片区| 国产日韩中文在线| 午夜精品久久久久久久99热浪潮| 不卡毛片在线看| 狠狠躁夜夜躁人人爽超碰91| 91牛牛免费视频| 久久香蕉国产线看观看av| 亚洲日韩欧美视频| 欧美在线观看一区二区三区| 国产精品亚洲第一区| 在线性视频日韩欧美| 在线观看欧美日韩| 午夜精品一区二区三区视频免费看| 久久久女女女女999久久| 亚洲高清色综合| 日韩视频永久免费观看| 久久久久久com| 岛国视频午夜一区免费在线观看| 岛国av在线不卡| 欧美成人午夜免费视在线看片| 亚洲va国产va天堂va久久| 国外成人免费在线播放| 日韩激情av在线免费观看| 国产福利精品av综合导导航| 68精品久久久久久欧美| 国产精品久久二区| 精品久久久一区| 在线亚洲男人天堂| 欧美性猛交xxxx富婆弯腰| 综合激情国产一区| 欧美成人免费全部观看天天性色| 久久综合色88| 欧美野外wwwxxx| 亚洲一区二区精品| 欧美综合在线观看| 国产91精品久久久| 日韩**中文字幕毛片| 亚洲成人教育av| 亚洲欧美日韩精品久久奇米色影视| 精品在线观看国产| 国产精品第二页| 91夜夜揉人人捏人人添红杏| 97精品久久久中文字幕免费| 黑人狂躁日本妞一区二区三区| 亚洲无线码在线一区观看| 欧美日韩国内自拍| 久久久视频免费观看|