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

首頁 > 編程 > HTML > 正文

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

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

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

  1. 隨機產生一張圖片
  2. 拿到微信用戶的頭像和稱呢(自己調后端的接口獲取)
  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
97国产在线观看| 国产欧美日韩高清| 亚洲欧美中文日韩在线v日本| 国产精品吹潮在线观看| 久久久久久久久爱| 久久久av电影| 一区二区欧美亚洲| 国产成人一区二| 免费成人高清视频| 北条麻妃在线一区二区| 日韩欧美成人免费视频| 在线观看日韩专区| 久久精品国产成人| 国产精品久久婷婷六月丁香| 久久久人成影片一区二区三区| 亚洲人成在线一二| 精品久久久在线观看| 91超碰中文字幕久久精品| 久久久久中文字幕| 色综合久久天天综线观看| 亚洲福利在线看| 亚洲激情视频在线观看| 国产日韩亚洲欧美| 狠狠爱在线视频一区| 91中文在线视频| 亚洲国产精品久久久| 中文字幕精品一区久久久久| 国产亚洲精品激情久久| 国产欧美日韩精品丝袜高跟鞋| 91精品视频播放| 亚洲国产天堂网精品网站| 日本成人黄色片| 久久天天躁狠狠躁老女人| 亚洲最新中文字幕| 91久久精品国产91久久性色| 精品国产一区久久久| 热久久免费国产视频| 奇米一区二区三区四区久久| 九九久久久久久久久激情| 日韩精品一二三四区| 国产乱人伦真实精品视频| 日韩欧美精品网站| www.xxxx精品| 欧美激情伊人电影| 国产一区二区av| 精品亚洲aⅴ在线观看| 亚洲欧洲高清在线| 欧美自拍大量在线观看| 欧美视频中文字幕在线| 国产精品久久久久久久久久三级| 91精品国产91久久久久久久久| 热久久免费视频精品| 欧美黄色片免费观看| 欧美激情精品久久久久久黑人| 日韩精品免费在线| 国产精品高潮呻吟视频| 国产日本欧美一区二区三区在线| 国产精品久久久久av| 欧美日韩第一页| 亚洲最大成人网色| 久久精品视频va| 欧美不卡视频一区发布| 国产精品自产拍在线观| 精品久久久久久久久久ntr影视| 欧美激情一区二区三区高清视频| 欧美综合在线第二页| 亚洲摸下面视频| 国产在线播放91| 欧美尺度大的性做爰视频| 欧美黄色片在线观看| 精品一区二区三区电影| 欧美激情精品久久久久久免费印度| 黑人狂躁日本妞一区二区三区| 久久免费在线观看| 亚洲女成人图区| 日韩电影在线观看中文字幕| 国产精品久久久久一区二区| 亚洲自拍偷拍一区| 亚洲新声在线观看| 亚洲综合国产精品| 欧美一区三区三区高中清蜜桃| 亚洲激情视频在线观看| 91大神在线播放精品| 国产精品88a∨| 成人免费视频a| 国产小视频国产精品| 久久精品国产免费观看| 精品在线观看国产| 69影院欧美专区视频| 欧美xxxx做受欧美.88| 日韩电影在线观看免费| 成人av资源在线播放| 日韩av黄色在线观看| 亚洲片在线观看| 亚洲第一网站免费视频| 色偷偷av一区二区三区乱| 热久久美女精品天天吊色| 久久国产天堂福利天堂| 日韩精品欧美激情| 78色国产精品| 亚洲欧美一区二区三区久久| 久久99亚洲精品| 中文字幕av一区二区三区谷原希美| 亚洲人成欧美中文字幕| 欧美精品久久一区二区| 久久人人爽人人| 亚洲一区二区自拍| 国产精品久久久久久久9999| 国产主播精品在线| 91成人免费观看网站| 日韩精品在线私人| 亚洲国产精品999| 97国产精品视频| 国产成人中文字幕| 国产精品福利无圣光在线一区| 亚洲精品理论电影| 久99九色视频在线观看| 国产午夜精品全部视频在线播放| 中文字幕欧美精品日韩中文字幕| 隔壁老王国产在线精品| 日本精品久久电影| 日韩精品有码在线观看| 欧美日韩aaaa| 性欧美视频videos6一9| 国产成+人+综合+亚洲欧美丁香花| 欧美日韩一区二区在线播放| 国产精品久久久久久久久久ktv| 日韩免费av在线| 国产午夜精品免费一区二区三区| 亚洲视频精品在线| 精品国产乱码久久久久久婷婷| 88国产精品欧美一区二区三区| 成人精品福利视频| 成人免费在线网址| 日韩av手机在线看| 亚洲成人久久网| 国产成一区二区| 国产精品久久久久久久久久99| 中文字幕亚洲情99在线| 精品中文字幕视频| 国内精品久久久久伊人av| 69影院欧美专区视频| 亚洲二区中文字幕| 日韩av在线免费| 国产精品网址在线| 高清欧美性猛交xxxx| 欧美日韩国产丝袜另类| 不卡毛片在线看| 精品久久久免费| 久久91精品国产| 亚洲国产99精品国自产| 国产日韩视频在线观看| 最近2019年手机中文字幕| 欧美激情精品久久久久久变态| 亚洲美女视频网| 一区二区三区黄色| 亚洲性生活视频在线观看| 亚洲色图欧美制服丝袜另类第一页| 欧美日韩加勒比精品一区| 久久成人在线视频| 国产成人精品电影久久久| 91精品国产高清久久久久久久久| 亚洲成人久久一区| 午夜精品久久久久久久久久久久|