vue的h5页面生成canvas海报图,要求绘制一张背景底图,在背景图上绘制头像,文字和二维码,最后合成一张图片

npm install --save qrcode 下载生成二维码的依赖包

<template><div><div @click="fncreatQode">点击生成海报</div><div class="" ><div class="postsavebtn">长按保存海报</div><div class="postimg"><!-- 展示海报图 --><img :src="canvasimg"  /></div><!-- 生成二维码canvas --><canvas id="postcanvas" class="postcanvas" style="width: 510px;height: 900px;"></canvas></div></div></template><script>import QRCode from 'qrcode'export default {data(){return {qodePicture:'',canvasimg:'',}},mounted(){},methods:{  fncreatQode(){//h5生成二维码let that = this// 这个weburl是扫码后需要跳转的地址var weburl = 'https://xxvfd.com?id=1'QRCode.toDataURL(weburl, {version: 7,errorCorrectionLevel: 'Q',width: 150,//二维码尺寸大小height: 150//二维码尺寸大小}).then((url) => {// url为base64的图片that.qodePicture = url// 开始绘制海报that.fncreatCanvas()}).catch((err) => {console.error(err)})},async fncreatCanvas(){const that = thisvar width = 510*2,radius=10*2,height=900*2var canvas = document.getElementById("postcanvas");var qodectx = canvas.getContext("2d");// canvas的样式尺寸还是原尺寸,这里的canvas尺寸设置为原来的2倍,防止生成的图片不清晰,另外设置宽高可以清空画布canvas.width = widthcanvas.height = height// 绘制带圆角的矩形,海报背景图为带圆角的矩形qodectx.beginPath();qodectx.arc(width-radius, height-radius, radius, 0, Math.PI/2);qodectx.lineTo(radius, height);qodectx.arc(radius, height-radius, radius, Math.PI/2, Math.PI);qodectx.lineTo(0, radius);qodectx.arc(radius, radius, radius, Math.PI, Math.PI*3/2);qodectx.lineTo(width-radius, 0);qodectx.arc(width-radius,radius,radius,Math.PI*3/2, Math.PI*2);qodectx.clip()qodectx.closePath()// 绘制海报图await that.creatImage('../../postimg.png').then((img) => {//由于海报做底图,头像文字都在海报上面,用异步qodectx.drawImage(img, 0, 0,width,height)qodectx.font = "Bold 48px Arial";qodectx.textAlign = "center"qodectx.fillStyle = "#fff";qodectx.fillText('恭喜发财', 180*2, 70*2);});// 绘制二维码await that.creatImage(that.qodePicture).then((img) => {qodectx.drawImage(img, 350*2, 735*2,125*2,125*2)});  // 绘制头像await that.creatImage('../../headimg.png').then((imgs) => {that.drawCircleImage(qodectx, imgs, 30*2, 30*2,50*2);})// 将canvas换成base64图片展示that.canvasimg = canvas.toDataURL();},creatImage(src) {return new Promise((resolve, reject) => {const img = new Image();// 设置图片跨域,不然如果有跨域,手机显示不出来img.setAttribute('crossOrigin', 'anonymous');img.onload = () => {resolve(img);};img.onerror = () => {reject();};img.src = src;if (img.complete) {resolve(img);}});},drawCircleImage(ctx, img, x, y,r){ctx.beginPath();let d = r * 2;let cx = x + rlet cy = y + r;ctx.arc(cx, cy, r, 0, 2 * Math.PI);// 默认边框是黑色,设置为透明的ctx.strokeStyle = 'transparent'; ctx.stroke(); ctx.clip();ctx.closePath()ctx.drawImage(img, x, y, d, d);},}}
</script>

注:这里如果图片有跨域,需要设置一下img.setAttribute('crossOrigin', 'anonymous');,否则手机显示不 出来;

因为绘制的图片是叠加,所以用了异步,否则头像文字会被背景图遮挡住。

H5页面canvas绘制多张图片和二维码生成相关推荐

  1. java(spring boot2.x版本)实现二维码生成(可以插入中间log和底部文字)

    1.创建一个spring boot项目(非必须): 项目结构: 2.导入maven依赖: <dependency><groupId>org.springframework.bo ...

  2. canvas 插件_基于canvas的JavaScript 二维码生成工具——QRCanvas

    介绍 在我们日常的开发中,特别是在现代的社会环境下,二维码的应用可谓是丰富多彩,各种各样让人眼花缭乱的二维码,可见二维码已经渗透进我们生活的方方面面,也可以说目二维码确确实实方便了我们的生活.因为作为 ...

  3. iOS - 二维码生成、扫描及页面跳转

    主要内容的介绍 普通二维码生成 彩色二维码生成 带有小图标二维码生成 扫描二维码的自定义 是否开启闪光灯 从相册中获取二维码 扫描成功之后提示音 扫描成功之后的界面之间的跳转 扫描二维码界面采取了微信 ...

  4. uniapp H5 二维码生成

    vue 二维码生成步骤: 1. 引入二维码 import QRCode from 'qrcodejs2' 2. html 3. 二维码生成事件 creatQrCode() { var qrcode = ...

  5. 玩转Android之二维码生成与识别

    二维码,我们也称作QRCode,QR表示quick response即快速响应,在很多App中我们都能见到二维码的身影,最常见的莫过于微信了.那么今天我们就来看看怎么样在我们自己的App中集成二维码的 ...

  6. 条形码/二维码生成探索

    条形码/二维码生成探索 所用依赖 <!--条形码生成依赖(轻量型,推荐使用这个)(生成条码的同时会把信息生成到条形码下)--><dependency><groupId&g ...

  7. Android之二维码生成与识别 读取相册

    二维码生成与扫描 转自http://blog.csdn.net/u012702547/article/details/51501350 读取相册二维码 转自http://blog.csdn.net/a ...

  8. Android用Zxing扫二维码/生成二维码功能

    新年已过,一切恢复真正常,新的一年给自己几句指引: 光努力还不行,方向很重要. 总是想着最坏的结果,就会让人失去改变的勇气. 你当然有权利选择自己的人生--但只有在你真正强大后,逆行的阻力才会降到最小 ...

  9. zxing 二维码生成深度定制

    二维码生成服务之深度定制 之前写了一篇二维码服务定制的博文,现在则在之前的基础上,再进一步,花样的实现深度定制的需求,我们的目标是二维码上的一切都是可以由用户来随意指定 设计 1. 技术相关 zxin ...

最新文章

  1. 艾伟:MOSS 2007 项目的开发步骤
  2. 工信部 以智能制造为切入点推进互联网+
  3. 第4章 Python 数字图像处理(DIP) - 频率域滤波1 - 傅里叶级数和变换简史
  4. CF1500C Matrix Sorting(拓扑排序)
  5. redis+lua实现分布式限流
  6. (18) Node.js npm包管理工具
  7. 视频抽帧并存图 python_使用Python实现跳帧截取视频帧
  8. grpc(3):使用 golang 开发 grpc 服务端和client
  9. 软考中级职称 软件工程师 学习知识点记录
  10. Axure RP 7.0初学篇01-------安装
  11. 计算机复制功能快捷键,电脑复制快捷键是什么(全部复制粘贴的快捷键是什么)...
  12. 日期计算(来自计蒜客)
  13. 计算机标题与目录怎么修改,自动生成目录怎么弄-Word目录如何自动生成与更改删除,及添加新内容如何更新等操作...
  14. intel无线网络管理服务器,配置Intel无线网卡连接到管理帧保护(MFP) -启用网络
  15. 360又抢了12306的风头:它为什么能提前49天订票?
  16. 一年三 季 醋 泡 姜
  17. C# 抓图服务的实现
  18. 涂鸦智能 ① tuya-wifi-mcu-sdk-arduino-library 简单剖析
  19. 直播平台软件开发的前端如何实现整套视频直播技术流程
  20. 解决 Elasticsearch 分页查询记录超过10000时异常

热门文章

  1. 【网络流与线性规划24题】【机器人路径规划问题】【IDA*】【题解】
  2. 基于 UDP 的 Socket 编程
  3. osgearth设置osgEarth::Util::Viewpoint视口
  4. WordPress代码和分析-页面模板是从哪里来的
  5. nwjs解决页面透明化,启动时显示白屏的问题
  6. 用 PHP 构建自定义搜索引擎
  7. 【论文简述及翻译】Correlate-and-Excite: Real-Time Stereo Matching via Guided Cost Volume Excitatio(CVPR 2021)
  8. 大疆口袋相机美颜怎么设置_飞宇发布Pocket口袋云台相机,怎么看着像大疆
  9. 服务器前端文件配置,服务器前端文件配置
  10. UE4打包时出现 FMemoryWriter does not support data larger than 2GB 的解决方案