vue.js 生成分享海报

1,772 阅读1分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。

生成朋友圈海报这个功能也是网站开发中经常会遇到的场景,比如分享朋友圈的海报,那么该如何实现呢?

今天就给大家分享一个简单的实现案例。

直接上代码:

<html>
<head>
<title>长按图片保存分享</title>
<meta name="viewport" content="640, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.js"></script>
</head>
<body>
<style>
*{
	margin:0;
	padding:0;
}
body,
html {
	width: 100%;
	height: 100%;
	padding-bottom:30px;
}

#imgBox {
	width: 100%;
	height: 100%;
}
#imgBox p {
	font-size:12px;
	line-height:30px;
	color:#aaa;
	background-color:#fff;
	text-align:center;
	margin-bottom:10px;
}
img {
	width: 80%;
	display: block;
	margin:0 auto;
	box-shadow: 0 0 30px rgba(0,0,0,.2);
}
</style>
<div id="imgBox">
	<p>长按图片保存到系统相册中然后分享</p>
	<img :src='imgSrc' v-if="imgSrc" />
</div>
<script>
// js主要结构
new Vue({
    el:'#imgBox',
    data:{
        userName: 'Hackun@掘金',//用户称呢
        imgSrc: '',//合成最终图片
        qrCode: 'https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/img/app_download_QR.40b04a4.png'//二维码
    },
	mounted(){
		this.drawCanvasBgImg();
	},
    methods: {  
        // 获取页面dpr和宽度

        getWindowInfo() {
            var windowInfo = {};
            windowInfo.dpr = window.devicePixelRatio;
            if (window.innerWidth) {
                windowInfo.width = window.innerWidth;
            }
            else {
                windowInfo.width = document.body.clientWidth;
            }
            return windowInfo;
        },
        //拿到数据后开始画背景大图 想法很简单就是把图片画到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 = 640;//dpr * clientWidth;  //由于手机屏幕时retina屏,都会多倍渲染,用dpr来动态设置画布宽高,避免图片模糊			
			canvas.height = 1138;//dpr * clientWidth * 609 / 375;//去掉微信头部的状态栏应该是603 没搞懂603还是不能让图片满屏直接多加到了609
			var img = new Image();
			img.crossOrigin = '';//死坑的图片跨域 (img.crossOrigin = "Anonymous"这种写法还是不能显示base64格式图片)
			img.src = "https://source.unsplash.com/random";//背景图
			img.onload = function () {
				ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
				vm.drawCanvasqrImg(canvas, ctx, dpr);
			}
		},
		// 绘制二维码
		drawCanvasqrImg: function (canvas, ctx, dpr) {			
			var vm = this;
			var start = 182;
			var imgX = start;//图片X开始坐标
			var imgY = 495;//图片Y开始坐标
			var imgWidth = 275;
			var img = new Image();
			img.crossOrigin = '';
			img.src = this.qrCode;
			img.onload = function () {
				ctx.drawImage(img, imgX, imgY, imgWidth, imgWidth);
				ctx.restore(); // 还原状态
				vm.canvasFillPin(canvas, ctx, dpr);
			}
		},
		canvasFillPin (canvas, ctx, dpr) {
			var vm = this;
			var fontSizeThis = 30 + 'px' + ' Arial';
			var userNameY = 830;//用户名Y轴坐标
			ctx.font = fontSizeThis;
			// 需要用户名是写入用户名
			if (this.userName) {
				ctx.fillStyle = "white"; 
				ctx.textAlign = 'left';
				var w = ctx.measureText(this.userName).width;
				ctx.fillText(this.userName,(canvas.width-w)/2, userNameY);
				
				ctx.restore(); // 还原状态
				this.convertCanvasToImage(canvas);
			}		
		},
		
        convertCanvasToImage (canvas) {
            this.imgSrc = canvas.toDataURL("image/jpeg");//png有毒在安卓机下识别二维码无法跳转
            this.$Spin.hide();
        }
    }
})
</script>
</body>
</html>

以上代码直接复制就可以用,有问题欢迎留言!

效果演示:

希望帮助到更多需要的小伙伴,好东西大家一起分享!!!