HTML使用canvas绘制海报(网络图片)

生成前:

 

生成后:

 

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8">

		<title>媒体参会嘉宾邀请函生成链接</title>
		<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.10/lib/index.css" />

		<style>
			#app {
				width: 100vw;
				position: relative;
			}

			* {
				margin: 0;
				padding: 0;
			}

			[v-cloak] {
				display: none;
			}

			.bg {
				width: 100vw;
				height: 100vh;
				min-height: 100vh;
				position: relative;
				overflow: hidden;
			}


			#scream {
				width: 100%;
				height: 100%;

			}

			.closeImg {
				width: 34px;
				height: 34px;
			}

			.pop {
				position: absolute;
				top: 0;
				left: 0;
				height: 100%;
				width: 100%;
				background: rgba(0, 0, 0, 0.6);
				z-index: 98;
			}

			.saveImg {
				width: 100%;
				display: block;
			}

			.popImg {
				width: 100%;
				position: absolute;
				top: 0;
				left: 0;
				z-index: 9999;
			}

			.popImgClose {
				width: 100%;
				height: 100px;
				line-height: 100px;
				position: fixed;
				top: 0;
				left: 0;
				z-index: 19999;
				font-size: 36px;
				font-weight: 500;
				color: #fff;
				text-shadow: 0px 3px 6px rgba(0, 0, 0, 0.1);
				letter-spacing: 4px;
				text-align: center;
				background: rgba(0, 0, 0, 0.6);
			}

			.flex-between {
				display: flex;
				align-items: center;
				justify-content: space-between;
				padding: 0 30px;

			}

			.inputName {
				max-width: 100%;
				border: none;
				background: transparent;
				font-size: 100px;
				font-family: Source Han Sans CN;
				font-weight: bold;
				color: #2274F6;
				position: absolute;
				left: 50%;
				top: 30.9%;
				transform: translate(-50%, -30.9%);
				text-align: center;
				outline: transparent;
				z-index: 1;
			}



			.inputName::-webkit-input-placeholder {
				color: #2274F6;
			}

			.inputName::-moz-placeholder {
				color: #2274F6;
			}

			.inputName::-moz-placeholder {
				color: #2274F6;
			}

			.inputName::-ms-input-placeholder {
				color: #2274F6;
			}


			#myCanvas {
				position: absolute;
				left: -9999px;
				top: -9999px;
			}

			.createImg {
				width: 200px;
				height: 200px;
				line-height: 200px;
				top: 50%;
				right: 10px;
				border-radius: 50%;
				position: fixed;
				font-size: 36px;
				font-family: PingFang SC;
				font-weight: bold;
				    color: #fff;
				    background: rgba(0, 0, 0, 0.5);
				opacity: 1;
				z-index: 9;
				text-align: center;
			}

			.van-notify {
				padding: 30px 20px;
				font-size: 40px;
			}
		</style>
	</head>


	<body>
		<div id="app" v-cloak>
			<img id="scream" :src="imgSrc+'?a='+new Date().getTime()" alt="The Scream" @load="afterLoad">
			<input autofocus="autofocus" type="text" name="input_name" v-model="name" class="inputName" maxlength="8"
				placeholder="点击输入姓名" />
			<div v-on:click='canvas' class="createImg">点击生成</div>
			<canvas id="myCanvas" :width="imgWidth" :height="imgHeight" ref="canvas">
				您的浏览器不支持 HTML5 canvas 标签。</canvas>
			<div class="pop" v-if='showImg' v-on:click="showImg = false">
			</div>
			<div class="popImgClose" v-if='showImg'>
				<div class="flex-between"> <span>长按保存至相册,关闭此行可重新输入姓名生成</span>
					<img :src="closeImg" class="closeImg" v-on:click="showImg = false" alt="">
				</div>

			</div>
			<div class="popImg" v-if='showImg'>
				<img class="saveImg" :src="saveImg" alt="">
			</div>
		</div>
		<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
		<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.min.js"></script>
		<script src="https://cdn.jsdelivr.net/npm/vant@2.10/lib/vant.min.js"></script>
		<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js" type="text/javascript"></script>
		<script>
			new Vue({
				el: '#app',
				data: {
					context: {}, //canvas
					imgHeight: '1503', //图片高度
					imgWidth: '750', //图片高度
					name: '',
					saveImg: '', //保存图片
					showImg: false, //显示图片
					closeImg: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAxCAMAAABEQrEuAAAAzFBMVEUAAAD///86kuEIAAAARHRSTlMAAQIDBAUGBxcYGhshIiRLTVBUVVdZW2lwcnN0dXeEhYiLjI2VlpeYmZqcnZ6foKGjpKanqKmrrK2ur7CztbbBxMXIzKPOVfAAAAHqSURBVEjHnZZ5W8IwDMZZr6l4X3hfoBPBDSZzoODBvv93soMm6452e9xfaZvf2jTp27Za//g2Orf7TgM/snfT2UyN3Z8kSQK3FhDP0u97S1pnSfr1RQ3Aeyu/K2l2kyaIeFy73Uv7ZG0mgQ0RL8rrVDboUDUG3LykJ/gtSZtuHxDTLNxTHkO1QQKQcTXCXwHAcRHApKwCYBDDWEuBGABSjoUD4OdyxgGJiggfAVBYshirgZDm+qmv+t9KMWIsoR4L8y2bwgCZZQibAFCZKx6p4ZhAtYaq592QKQ4OMc0DkbGAKLgsUoR8AMDMBcdmymnutJypsj+5rahZDAgBYMZrjiYgSwBo3eGki0T/vli9ANC5BixYE21xMmRBmskRgRiWvBmA26pl3z7DVIsjbhAHZrpUliYgLOQjrMkHw8rikMrQXiSTbFsx+5EFwSO6yjSWZWCMhfv5cHGJJoFF1cDiw/NSLX0oZNp5wINcpckoZLlAeWDUZNTWwhFFhSnGgupdUg2UvvyVJDxziKjJfbfiBqoUMtTkoVu4FKu0NS+wnhoXPYN6ZwhcSd5qFuLVARoySJED1RjZHgEuXK/HsnGn0RZEraQr7fPCpWha2Bq5luZOw3eJm27y73Zqti+6R43ePocPl+3/PK7+AKHzueY3wvW7AAAAAElFTkSuQmCC',
					imgSrc: 'https://eventimg.oss-cn-shen.aliyuncs.com/jintuoluo/invitation/invitation_2023.jpg',//海报背景
					toast: null
				},
				created() {
					this.toast = vant.Toast.loading({
						duration: 0, // 持续展示 toast
						forbidClick: true,
						message: '加载中...',
					});

				},

				methods: {
					canvas() {
						if (!this.name) {
							this.$notify({
								background: "#831E21",
								message: '请输入姓名',
							});
							return
						}
						let imgs = new Image();
						  imgs.setAttribute('crossorigin', 'anonymous');//解决网络图片跨域的问题
						imgs.src = this.imgSrc;
						let imgWidth = 0,
							imgHeight = 0,
							that = this;
						//获取图片宽高
						imgs.onload = function() {
							imgWidth = imgs.width
							imgHeight = imgs.height
							const canvas = that.$refs.canvas
							that.context = canvas.getContext("2d");
							that.context.drawImage(imgs, 0, 0, that.imgWidth, that.imgHeight);
							that.context.save();
							that.context.font = "bold 76px Source Han Sans CN";
							that.context.textAlign = "center";
							that.context.fillStyle = "#2274F6"
							that.context.fillText(that.name, that.imgWidth / 2, 516, 600);
							that.context.save();
							document.body.scrollTop = document.documentElement.scrollTop = 0
							var base64Img = canvas.toDataURL('image/jpeg');
							that.showImg = true;
							that.saveImg = base64Img;

						};
					},
					afterLoad() {
						vant.Toast.clear();
					},
				},
			})
		</script>

	</body>


</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/121997.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装 Node.js

首先&#xff0c;我们需要安装 Node.js 和相关的库&#xff0c;如 request 和 cheerio。 npm install request cheerio然后&#xff0c;我们可以使用以下代码来爬取网页内容&#xff1a; const request require(request); const cheerio require(cheerio);request({url: js…

6.ELK之Elasticsearch嵌套(Nested)类型

0、前言 在Elasticsearch实际应用中经常会遇到嵌套文档的情况&#xff0c;而且会有“对象数组彼此独立地进行索引和查询的诉求”。在ES中这种嵌套文档称为父子文档&#xff0c;父子文档“彼此独立地进行查询”至少有以下两种方式&#xff1a; 1&#xff09;父子文档。在ES的5.…

react组件间通信之context

一般用于【祖组件】与【后代组件】间通信 案例&#xff1a; A,B,C,D四个组件的关系分别为&#xff1a;爷爷&#xff0c;爸爸&#xff0c;儿子&#xff0c;孙子 从A向C传递参数&#xff1a;C组件为类式组件 从A向D传递参数&#xff1a;D组件为函数组件 import React, { Componen…

22款奔驰GLS450升级中规主机 实现导航地图 中文您好奔驰

很多平行进口的奔驰GLS都有这么一个问题&#xff0c;原车的地图在国内定位不了&#xff0c;语音交互功能也识别不了中文&#xff0c;原厂记录仪也减少了&#xff0c;使用起来也是很不方便的。星骏汇小许 Xjh15863 其实很简单&#xff0c;我们只需要更换一台中规的新主机就可以实…

排序算法之-选择

算法原理 在未排序的数列中找出最大&#xff08;或最小&#xff09;的元素&#xff0c;然后将其存入到已排序的数列起始位置&#xff0c;紧接着在剩余的未排序数列中继续查找最大&#xff08;或最小&#xff09;的元素&#xff0c;并将其放入到已排序的数列末尾&#xff0c;依…

SLAM从入门到精通(光源的控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;图像在二维码、道路检测、故障物检测方面都有很重要的作用。但是&#xff0c;这里面就有一个前提&#xff0c;那就是图像…

音乐免费下载mp3格式+音频格式转换+剪辑音频+合并音频教程

1.在qq音乐网页版搜索想要的歌曲 qq音乐网站&#xff1a;https://y.qq.com/ 如果你是vip可以直接下载vip的歌曲&#xff0c;如果不是选择不是vip的歌曲进行第一步的操作 2.点击播放进入页面后F12拿到音频地址 然后双击src里面的音频地址复制 网页新标签打开赋值的这个链接&a…

『 MySQL数据库 』数据库基础之表的基本操作

文章目录 创建表&#x1f5e1;查看表&#x1f5e1;✒ 查看表内所有信息(描述\表结构等)✒ 根据条件查看表内数据✒ 查看表的具体详细信息: 修改表&#x1f5e1;✒ 修改表名:✒ 修改表的存储引擎、编码集(字符集和校验集):✒ 表内插入数据:insert into✒ 在表中新添一个字段(列)…

Python基础入门----Python文件操作:文件读写、文件对象方法、with语句

文章目录 文件读写模式文件对象方法with语句在Python中,文件操作是一项基本技能,它允许你读写文件,并与文件系统进行交互。这篇文章将详细介绍如何使用Python进行文件读写,涉及不同的文件模式,文件对象的方法,以及如何使用with语句来管理文件资源。 文件读写模式 在Pyt…

11-2 mybatis入门细节

mybatis Mybatis 单表CURD细节 ${} 与#{} 区别(面试题) ${} 拼接sql 造成sql注入 #{} 使用?占位 如果作为值, 推荐使用#{} ${} 实现一些动态排序,使用 #{column} select * from tb_userinfo order by ? desc column: id 赋值 sql: select * from tb_userinfo order by id …

MFC串口通信(SerialPort)

目录 1、SerialPort类的介绍和使用&#xff1a; &#xff08;1&#xff09;、SerialPort类的功能介绍 &#xff08;2&#xff09;、SerialPort类提供接口函数的介绍 1&#xff09;、InitPort函数 2&#xff09;、控制串口监视线程函数 3&#xff09;、获取事件&#xff0c…

基于JavaWeb+SpringBoot+微信小程序的酒店商品配送平台系统的设计和实现

基于JavaWebSpringBoot微信小程序的酒店商品配送平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 本章内容概括了基于微信小程序的酒店商品配送平台的可行性分析、系统功…

Linux安装Python3.10与部署flask项目实战详细记录

java开发新手入门Python,创建flask后端服务对外提供访问.记录一下在阿里云服务器部署flask项目的操作过程,简单介绍一下使用的阿里云服务器系统配置:ubantu16.04,其他内核版本操作部分命令会有所区别,下面开始详细操作过程! 1.pycharm创建flask项目并打包 2.Python3.…

Apache Storm 2.5.0 单机安装与配置

1、下载storm 2.5.0 2、需要安装python3&#xff0c;并且设置python3的环境变量 3、修改storm.yaml配置 storm.zookeeper.servers:- "node4" # - "server2" # # nimbus.seeds: ["host1", "host2", "host3"] # nimbus…

javaSE学习笔记(五)集合框架-Collection,List,Set,Map,HashMap,Hashtable,ConcurrentHashMap

目录 四、集合框架 1.集合概述 集合的作用 集合和数组的区别 集合继承体系 数组和链表 数组集合 链表集合 2.Collection 方法 集合遍历 并发修改异常 3.List List集合的特有功能&#xff08;核心是索引&#xff09; 集合遍历 并发修改异常产生解决方案ListIterato…

ubuntu下Anaconda环境安装GPU的pytorch(docker镜像)

实验室需要给每个人分配docker的container环境&#xff0c;为了节省系统的空间&#xff0c;打算把anaconda和深度学习的开发环境配置好拉取镜像以省时间。 基础环境配置 apt更新了清华源 安装了基础环境 gcc vim Linux文本编辑库 openssh-server ssh远程连接库 net-tools 包含…

Visual Leak Detector 2.5.1 (VLD)下载、安装与使用

目录 1 软件介绍 2 下载与安装 2.1 工具下载地址 2.2 工具安装 3 配置与使用 3.1 配置环境变量 3.2 配置vs 3.3 VLD的配置 4 测试代码与报告生成 1 软件介绍 Visual Leak Detector 2.5.1 (VLD)是一个小巧内存检测工具&#xff0c;是为Visual C用户设计的。其特色为&a…

基于开源项目OCR做一个探究(chineseocr_lite)

背景&#xff1a;基于图片识别的技术有很多&#xff0c;应用与各行各业&#xff0c;我们公司围绕电子身份证识别自动录入需求开展&#xff0c;以下是我的研究心得 技术栈&#xff1a;python3.6&#xff0c;chineseocr_lite的onnx推理 环境部署&#xff1a;直接上截图&#xff…

ARMday2(环境创建+工程配置+创建文件+单步调试)

目录 一、汇编环境的创建 二、为工程配置链接脚本&#xff08;map.lds&#xff09; 三、为工程创建汇编文件 start.s 编程调试 接下来我们需要建立一个 start.s 汇编文件添加到我们的工程中去 四、对汇编代码进行单步调试&#xff08;仿真&#xff09; 五、汇编工程的编译 …

手握“发展密钥”,TCL科技或迎价值重估?

在高度竞争且快速变化的泛半导体产业&#xff0c;每一次周期性或结构性的变化&#xff0c;都会对企业经营策略带来深远的影响。 2023年前三季度&#xff0c;泛半导体产业迎来结构性复苏。其中&#xff0c;主流显示领域供需关系趋向健康化&#xff0c;半导体显示行业整体上量价…
最新文章