首页 > 其他分享 >vue使用canvas合成海报

vue使用canvas合成海报

时间:2022-10-25 14:57:39浏览次数:72  
标签:canvas vue img ctx 海报 height width var

接着上面随笔,继续探索~~~

上篇合成海报的过程有点负责冗余。完全可以不借助插件,用canvas合成~~

需求背景:多张模版可供选择,用户输入姓名,上传头像,最终合成海报保存分享。

1.头像有黑色边框,可利用背景图剧中显示。用户输入的姓名定位到海报具体位置。

2.上传头像部分通过@change=uploadImg(e),e拿到图片信息。

   ---先做个判断拦截

  //上传图片   var file = e.target.files[0];   if (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) {     this.$toast('图片类型必须是.gif,jpeg,jpg,png,bmp中的一种')     return false;   }    ---然后读取图片信息       var reader = new FileReader();   reader.onload = e => { // 该事件是读取完成的时候触发。     this.headSrc = e.target.result // 上传图片   }   reader.readAsDataURL(file) // 读取文件     -------此时用户上传图片已经渲染在页面上 3.合成海报。分三部分,一部分模版,一部分用户输入姓名,一部分用户上传头像     -----   var c = document.createElement("canvas");   var ctx = c.getContext("2d");   c.width = this.pw; // 画布宽   c.height = this.ph; // 画布高     -----   var img = new Image();   img.src = _this.bgurl; // 背景图          img.onload = function() {     ctx.drawImage(img, 0, 0, c.width, c.height);     var img2 = new Image(); // 头像     _this.ClippingImage(_this.heardSrc,1,function(url){       img2.src = url; // 头像       console.log('img2',img2.src,url)       img2.onload = function() {         var d =2 * 58; // 头像圆圈直径         var cx = 545 + 54; // 圆心X轴坐标         var cy = 604 + 54; // 圆心Y轴坐标         ctx.arc(cx, cy, 54, 0, 2 * Math.PI); // 画圆         ctx.clip(); // 闭合圆圈 使后面的作图限制在圆圈内         ctx.drawImage(img2, 545, 604, d, d);  // 画头像
        ctx.strokeStyle='#c8c8c8'; // 头像描边颜色         ctx.lineWidth=6; // 头像描边宽度         ctx.beginPath(); // 开始画图         ctx.arc(cx, cy, 54, 0, 2 * Math.PI); // 描边绘画         ctx.stroke()                _this.modelSrc = c.toDataURL("image/png", 1);       };                          ctx.font = "30px Arial"; // 用户姓名字体样式       ctx.fillStyle="#fff";// 用户姓名字体颜色       ctx.fillText(_this.name,600,580); // 把用户姓名写入具体位置     })   } 4.ClippingImage方法是裁剪用户上传头像的方法。     ------   ClippingImage(base64Codes,quality,callback) {     var img = new Image();     img.src = base64Codes;     //生成canvas     var canvas = document.createElement('canvas');     var ctx = canvas.getContext('2d');     var sX,sY;     img.onload = function () {       if(img.width > img.height) { // 长形         canvas.width = img.height         canvas.height = img.height         sX = (img.width-img.height)/2         sY = 0       } else if (img.width < img.height) { // 竖形         canvas.width = img.width         canvas.height = img.width         sX = 0         sY = (img.height-img.width)/2       } else { // 正方形         canvas.width = img.width         canvas.height = img.width         sX = 0         sY = 0       }       ctx.drawImage(img,sX,sY,canvas.width,canvas.height,0,0,canvas.width,canvas.height);       var base64Result = canvas.toDataURL('image/png', quality);       callback(base64Result)    }  }                

标签:canvas,vue,img,ctx,海报,height,width,var
From: https://www.cnblogs.com/momoq/p/16824806.html

相关文章

  • html2Canvas 前端保存页面为图片
    html2canvas 能够实现在用户浏览器端直接对整个或部分页面进行截屏。这个html2canvas脚本将当页面渲染成一个canvas图片,通过读取DOM并将不同的样式应用到这些元素上实现。......
  • vue3 更改编译端口号
    在package.json文件中修改scripts"scripts":{"serve":"vue-cli-serviceserve--port80","build":"vue-cli-servicebuild","lint":"vue-cli-s......
  • vue实现剪贴图片上传
    <template><divclass="about"><divclass="box"><divid="preview"class="upload-preview"v-on:paste="handlePaste"></div><el-buttonv......
  • Vue笔记20 网络封装axios、模拟httpbin.org
                 ......
  • Vue笔记
    Vue一、 Vue基础1. Vue概述 Vue:渐进式JavaScript框架 声明式渲染->组件系统->客户端路由->集中式状态管理->项目构建 官网:https://cn.vuejs/org/v2/guide/2. Vue基本使用......
  • Vue笔记19 Vuex - Module
                                   ......
  • vue源码中的nextTick是怎样实现的
    一、Vue.nextTick内部逻辑在执行initGlobalAPI(Vue)初始化Vue全局API中,这么定义Vue.nextTick。functioninitGlobalAPI(Vue){//...Vue.nextTick=ne......
  • Vue3知识点之数据侦测
    Vue的核心之一就是响应式系统,通过侦测数据的变化,来驱动更新视图。实现可响应对象的方式通过可响应对象,实现对数据的侦测,从而告知外界数据变化。实现可响应对象的方式:g......
  • Vue3必会技巧-自定义Hooks
    Vue3自定义Hooks定义:个人理解:一些可复用的方法像钩子一样挂着,可以随时被引入和调用以实现高内聚低耦合的目标,应该都能算是hook;为什么Vue3要用自定义Hook?:结论:就是为了......
  • Vue笔记18 vueX npm install vuex --save 、Mutation
                                                重点:     ......