首先需要在模板中写上这两个元素canvas(id="canvas")div(id='qrcode')导入上传js,fabric.js,qrcodejs2import{upload}from'~/static/js/upload.js';import{fabric}from'fabric';importQRCodefrom'qrcodejs2';constQRCode=require('qrcodejs2');//这两个方法直接将qrcodejs2导入nuxt会报错需要判断为浏览器环境,然后使用require导入再合成图片asyncgroupImg(){returnnewPromise((resolve,reject)=>{try{//createobjectvarimg=newImage();//更改图片src(此图片地址为底图)img.src='图片地址';//加载完成后,执行img.onload=()=>{//Printconsole.log('-----开始合成图片');constimgW=img.width;constimgH=img.height;constcanvas=newfabric.Canvas('canvas');canvas.setWidth(imgW);canvas.setHeight(imgH);//设置canvas的宽高为图片底部的宽高,保证最终合成的图片是底图的尺寸canvas.skipTargetFind=true;//整个画板元素不能被选中constqrCodeUrl='二维码地址'constqrcode=newQRCode(document.getElementById('qrcode'),{width:240,height:240,colorDark:'#000000',colorLight:'#ffffff',correctLevel:0//最好调整err或者容忍度为0,否则生成的二维码会很密});qrcode.makeCode(qrCodeUrl);//再做一个code.//合成后立即获取二维码的url可能不可用,得加个延时console.log('qrcode',qrcode);fabric.Image.fromURL(baseimageurl,img=>{varimg1=img.set({left:0,top:0});fabric.Image.fromURL(头像图片url,img=>{varimg2=img.scale(0.6).set({left:6.7,//头像位置top:20,clipPath:newfabric.Circle({radius:50,//圆形originX:'center',originY:'center'})});fabric.Image.fromURL(document.getElementById('qrcode').querySelector('canvas').toDataURL('image/png'),asyncimg=>{varimg3=img.scale(1).set({left:105,top:423});//合并图片canvas.add(newfabric.Group([img1,img2,img3],{left:0,top:0}));constname=`.png`;//canvas.toDataURL()这个方法是Convertcanvastobase64//dataURLtoFile()这个方法是bsae64转换为文件流constfile=this.dataURLtoFile(canvas.toDataURL('image/png'),name);console.log('文件',文件);让config={typeName:'png',type:'img'};//这里开始上传文件constsharImageUrl=awaitupload(this,file,config);console.log('----------------sharImageUrl',sharImageUrl);解决(sharImageUrl);},{crossOrigin:'匿名'});},{crossOrigin:'匿名'});},{crossOrigin:'anonymous'});};}catch(错误){console.error(错误);拒绝(错误);}});},bsae64文件传输方法dataURLtoFile(dataurl,filename){//base64转文件,dataurl为base64字符串,filename为文件名(必须有后缀,如.jpg,.png)vararr=dataurl.split(','),mime=arr[0].match(/:(.*?);/)[1],bstr=atob(arr[1]),n=bstr。长度,u8arr=newUint8Array(n);而(n--){u8arr[n]=bstr。字符代码(n);}returnnewFile([u8arr],文件名,{type:mime});}如果有不对的地方请指出~fabric.js是一个js库,可以简化canvas的编写,提供canvas缺少的对象模型,包含事件监听、动画、数据序号和反序列化等高级功能.有兴趣的可以看看官网的例子
