在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这里用到的技术:
先上体验链接:g.cuggz.com/ 。 注:可以点击上方的连接进行使用,不过我的域名被TX屏蔽了,还在申诉中,所以无法在QQ、微信中打开,需要复制链接到浏览器进行查看、使用。 下面是这个小工具的截图: 1. 页面布局这部分不多说,直接上代码: <div class="wrapper"> <!-- 选择框 --> <div class="main-box"> <a class="prev" onClick='changeHat()'></a> <div class="main-img"> <div id="content"> <canvas id='cvs'></canvas> </div> </div> <a class="next" onClick='changeHat()'></a> </div> <!-- 导出图 --> <img id='export-img' alt='国庆专属头像' src='' crossorigin="anonymous"/> <!-- 操作按钮 --> <div class="operation-btns"> <a class="upload-btn"> <input id='upload' type='file' onchange='viewer()' style='opacity: 0;'/> </a> <a class="export-btn" onClick='exportFunc()'></a> </div> </div> <!-- 模板 --> <div style='display: none'> <img id='img' src='' alt='' /> <img class='hide' id='hat0' src='img/1.png' /> <img class='hide' id='hat1' src='img/2.png' /> <img class='hide' id='hat2' src='img/3.png' /> <img class='hide' id='hat3' src='img/4.png' /> <img class='hide' id='hat4' src='img/5.png' /> <img class='hide' id='hat5' src='img/6.png' /> <img class='hide' id='hat6' src='img/7.png' /> </div> 这个页面比较简单,外面就是一个大的背景图,中间就是一个头像的展示框以及模板的切换按钮,下面就是一个上传按钮和一个下载按钮。页面布局完之后,就是写样式了,CSS代码如下: body, html { min-height: 100%; width: 100%; user-select: none; font-size: 18px; } .wrapper { width: 100%; height: 100%; max-width: 620px; max-height: 800px ; margin: 0 auto; background-image: url('../img/bg.png'); background-repeat: no-repeat; background-size: 100% 100%; padding-top: 13em; } #export-img { display:none; margin:0 auto; width:250px; height:250px; } .main-box { display: flex; align-items: center; justify-content: center; } .main-box .next, .main-box .prev { background-image: url('../img/next.png'); background-size: contain; border-radius: 50%; width: 2.275rem; height: 2.275rem } .main-box .prev { transform: rotate(180deg) } .main-box .main-img { margin: 0 .75rem; background: #fff; border: .25rem solid #fbe6b5; border-radius: .75rem; font-size: 0 } #content { border-radius: .5rem; position: relative; width: 9.5rem; height: 9.5rem; margin-left: 50%; transform: translateX(-50%); overflow: hidden } .operation-btns { display: flex; align-items: center; justify-content: center; flex-direction: column; margin-top: .75rem } .operation-btns .upload-btn { width: 11.6rem; height: 3.6rem; background-size: 100% 100%; background-image: url('../img/upload.png') } .operation-btns .export-btn { display: none; width: 11.6rem; height: 3.75rem; background-size: 100% 100%; background-image: url('../img/export.png') } 这里只是简单的实现,仅供参考。还有很多可以优化的地方,这里不在修改,有兴趣的可以自己进行个性化定制。 2. 图片上传和展示接下来就是逻辑部分的实现了。首先,有几个全局变量需要先定义,后面会用到: let canvasFabric; // 画布实例 let hat = "hat0"; // 当前的模板class let hatInstance; // 模板图层实例 const screenWidth = document.getElementById("content").scrollHeight; // 内容框的高度 之后就需要处理上传的图片并将他展示在页面上: function viewer() { // 获取上传的图片文件 const file = document.getElementById("upload").files[0]; // 获取需要展示图片的标签 const img = document.getElementById("img"); // 创建文件读取文件对象 const reader = new FileReader(); if (file) { // 将文件转化为Base64 reader.readAsDataURL(file); // 当文件读取成功之后触发 reader.onload = () => { // 将base64的url赋值给要展示图片的标签 img.src = reader.result; // 图片加载完成触发 img.onload = () => img2Cvs(img); } } else { img.src = "" } } 这里使用到了
也就是说将上传的图片转化为了一个 这样就完成了图片的上传和展示,接下来就该初始化一个画布了。 3. 初始化画布在上面的代码的最后执行了 img.load,这里的 onload 事件会在图片加载完成后立即执行。在图片展示完成之后会执行img2Cvs方法,这个方法主要用来初始化一块画布,顺便展示和隐藏页面的部分元素。
可以通过npm命令来安装fabric.js库: npm install fabric --save 也可以通过cdn来引用: <script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.6/fabric.min.js"></script> 下面就来看看 function img2Cvs(img) { // 获取并展示canvas画布,并将画布的大小设置为图片的大小 const cvs = document.getElementById("cvs"); cvs.width = img.width; cvs.height = img.height; cvs.style.display = "block"; // 创建一个画布,并设置其位置和背景图 canvasFabric = new fabric.Canvas("cvs", { width: screenWidth, height: screenWidth, backgroundImage: new fabric.Image(img, { scaleX: screenWidth / img.width, scaleY: screenWidth / img.height }) }); // 切换模板 changeHat(); // 隐藏上传图片按钮,展示下载图片按钮 document.getElementsByClassName("upload-btn")[0].style.display = "none"; document.getElementsByClassName("export-btn")[0].style.display = "block"; } 这里面的 当创建好画布之后,就需要切换出第一个模板,并将上传图片按钮隐藏,以及将下载头像按钮显示出来。这样就完成了第一步的工作。下面就在来看看如何切换已有的模板。 4. 切换模板接下来就来看看切换模板是如何实现的: function changeHat() { // 隐藏当前的模板 document.getElementById(hat).style.display = "none"; // 获取所有的模板 const hats = document.getElementsByClassName("hide"); hat = "hat" + (+hat.replace("hat", "") + 1) % hats.length; // 获取当前的模板并展示出来 const hatImage = document.getElementById(hat); hatImage.style.display = "block"; // 如果当前存在图层,就将其移除 if (hatInstance) { canvasFabric.remove(hatInstance) } // 将当前的模板添加为图层对象 hatInstance = new fabric.Image(hatImage, { top: 0, left: 0, scaleX: screenWidth / hatImage.width, scaleY: screenWidth / hatImage.height, cornerColor: "#0b3a42", cornerStrokeColor: "#fff", cornerStyle: "circle", transparentCorners: false, rotatingPointOffset: 30 }); // 将图层对象设置为不可拉伸 hatInstance.setControlVisible({ mt: false, mb: false, ml: false, mr: false, bl: false, br: false, tl: false, tr: false, mtr: false, }) // 将图层添加到画布中 canvasFabric.add(hatInstance); } 在默认情况下,fabric.js元素带有八个点来缩放任何对象,这里我们是不希望用户在水平或垂直方向对 最后我们将使用模板生成的图层添加到了画布中,这里使用到了add方法,这是fabric提供的事件,以下为fabric.js官方提供的常用事件:
5. 输出图片
|
请发表评论