vue2.0 海报生成器、二维码生成器

由前端生成二维码,海报,canvas生成图片的跨域

之前做了一个生成带二维码的图片,需要在生成的图片中附带用户头像、用户昵称、商品图片、商品标题、商品链接二维码,效果图大概长这个样子
在这里插入图片描述
开始坑了
首先 楼主当时生成图片使用的是html2canvas, 生成二维码使用的是xkeshi/vue-qrcode
安装(由于使用的是vue2.0,所以是依赖注入的方法)

npm i xkeshi/vue-qrcode --save
npm i html2canvas --save

引入

import html2canvas from 'html2canvas';
import QRcode from '@xkeshi/vue-qrcode'

在html中写入二维码的标签 <qrcode class="qr_code" :value="qrcodeUrl" v-if="qrcodeUrl" :options="{ size: 65 }"></qrcode>,class随意发挥;value是二维码的链接地址,可以为任意地址,如:https://blog.csdn.net,可带参;options规定了二维码的大小,单位px
: qrcode标签需要在components中注册, components: { qrcode : QRcode }

至此,二维码就生成好了,只要选对了插件几乎不存在什么问题,接下来开始踩canvas坑,需要生成图片的元素如下:

<div ref="QrcodePage" class="card" :class="activeIndex===0?'card1':activeIndex===1?'card2':''">
    <div class="user">
    	<img :src="headImg" alt=""> 			//用户头像
	    <div class="user_name">
		    <p class="overflow_1">{{ $store.state.userInfo.nickName }}</p>		//用户昵称
		    <p>邀请你学习</p>
	    </div>
    </div>
    <p class="title">{{ courseInfo.goodsName }}</p>						//商品标题
    <img class="course_img" :src="courseInfo.imageUrl" alt="">			//商品图片
    <p class="scan">长按识别二维码</p>
    <qrcode class="qr_code" :value="qrcodeUrl" v-if="qrcodeUrl" :options="{ size: 65 }"></qrcode> 		//二维码
</div>

使用html2canvas生成海报/图片的代码如下:

createImg() {
    var that = this;
       let shareContent = this.$refs.QrcodePage, //需要截图的包裹的(原生的)DOM 对象
           width = shareContent.clientWidth, //shareContent.offsetWidth; //获取dom 宽度
           height = shareContent.clientHeight, //shareContent.offsetHeight; //获取dom 高度
           canvas = document.createElement("canvas"), //创建一个canvas节点
           scale = 4; //定义任意放大倍数 支持小数
       canvas.width = width * scale; //定义canvas 宽度 * 缩放
       canvas.height = height * scale; //定义canvas高度 *缩放
       canvas.style.width = (shareContent.clientWidth * scale) / 100 + "rem";
       canvas.style.height = (shareContent.clientHeight * scale) / 100 + "rem";
       canvas.getContext("2d").scale(scale, scale); //获取context,设置scale
       let opts = {
           scale: scale, // 添加的scale 参数
           canvas: canvas, //自定义 canvas
           logging: false, //日志开关,便于查看html2canvas的内部执行流程
           width: width, //dom 原始宽度
           height: height,
           useCORS: true
       };
       html2canvas(shareContent, opts).then(function(canvas) {
           that.qrContentImage = canvas.toDataURL("image/jpeg", 1.0);
       }).catch(function (reason) {
           alert(reason)
       });
},

生成后的展示如下

<div class="card_img">
	<img :src="qrContentImage">
</div>

在这里需要绘制到海报上的图片有两张,一是用户头像,二是商品图片,无独有偶,这两张图在绘制到canvas上时都产生了跨域问题,现在想想,生成的那张二维码好像也是图片,这小东西怎么就没跨域呢-…-
咳咳,言归正传,当时测试了一下,与当前域名相同的图片不会跨域,本地上传的图片不会跨域,其他来源的图片都会跨域,包括二级域名下的图片
最后的解决办法是将图片的host替换为当前的host,再由nginx转发到正确的host下,代码如下

let newurl = 'http://' +  window.location.host
this.headImg = this.headImg.replace("http://thirdwx.qlogo.cn", newurl)

不过这个方法至适用于来源已知且来源统一的图片,至此使用canvas绘制图片跨域的问题已解决
不过对于来源不统一的图片不适用,后来了解到可以在绘制前使用canvas将图片转为base64精灵图,base64在绘制时并不会产生跨域问题,不过本人并未深入研究,有需求的小伙伴可以继续踩坑

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要批量生成二维码并打包,你可以使用以下步骤: 1. 安装 vue-qr 插件:在命令行中运行 `npm install vue-qr --save`,或者在项目目录下运行 `yarn add vue-qr`。 2. 创建一个二维码生成器组件:在 Vue 应用中创建一个新的组件,用于批量生成二维码。在组件中使用 vue-qr 插件来生成二维码。 3. 创建一个数据源:在组件中创建一个数据源,用于存储所有要生成二维码的数据。可以使用数组或对象存储数据。 4. 使用 v-for 指令循环生成二维码:在组件中使用 v-for 指令循环遍历数据源,使用 vue-qr 插件生成二维码,并将生成的二维码添加到页面中。 5. 打包生成的二维码:在组件中添加一个按钮,当用户点击按钮时,使用 jszip 插件将所有二维码打包成一个压缩文件,并将文件下载到本地。 以下是一个简单的示例代码: ```html <template> <div> <div v-for="(data, index) in dataSource" :key="index"> <p>{{ data.name }}</p> <qrcode :value="data.code"></qrcode> </div> <button @click="handleDownload">Download</button> </div> </template> <script> import VueQr from 'vue-qr' import JSZip from 'jszip' import FileSaver from 'file-saver' export default { components: { VueQr }, data() { return { dataSource: [ { name: 'Qrcode 1', code: 'https://www.example.com/1' }, { name: 'Qrcode 2', code: 'https://www.example.com/2' }, { name: 'Qrcode 3', code: 'https://www.example.com/3' } ] } }, methods: { handleDownload() { const zip = new JSZip() this.dataSource.forEach((data, index) => { const imgData = this.$refs[`qrcode${index}`][0].$el.toDataURL() zip.file(`${data.name}.png`, imgData.substr(imgData.indexOf(',') + 1), { base64: true }) }) zip.generateAsync({ type: 'blob' }).then((content) => { FileSaver.saveAs(content, 'qrcodes.zip') }) } } } </script> ``` 在上述示例代码中,我们使用了 vue-qr 插件来生成二维码,使用 jszip 插件将所有二维码打包成一个压缩文件,并使用 file-saver 插件将文件下载到本地。注意,我们使用了 $refs 来获取每个二维码组件的实例,并将实例转换为图片数据进行打包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值