Vue使用Canvas绘制图片、矩形、线条、文字,下载图片


Posted in Javascript onApril 26, 2019

1 前言

1.1 业务场景

图片储存在后台中,根据图片的地址,在vue页面中,查看图片,并根据坐标标注指定区域。

由于浏览器的机制,使用 window.location.href 下载图片时,并不会保存到本地,会在浏览器打开。

2 实现原理

2.1 绘制画布

<el-dialog
  title="查看图片"
  :visible.sync="dialogJPG"
  append-to-body>
  <canvas id="mycanvas" width="940" height="570"></canvas>
</el-dialog>

这里为了交互体验,使用了 element-ui 的弹窗方式。将canvas画布放到了弹窗中。

为了突出画布效果可以在css中设置一个边框。

#mycanvas {
  border: 1px solid rgb(199, 198, 198);
}

2.2 绘制图片

// imageUrl为后台提供图片地址
doDraw(imageUrl){
  // 获取canvas
  var canvas = document.getElementById("mycanvas")
  // 由于弹窗,确保已获取到
  var a = setInterval(() =>{
    // 重复获取
    canvas = document.getElementById("mycanvas")
    if(!canvas){
     return false
    } else {
      clearInterval(a)
      // 可以理解为一个画笔,可画路径、矩形、文字、图像
      var context = canvas.getContext('2d')
      var img = new Image()
      img.src = imageUrl
      // 加载图片
      img.onload = function(){
        if(img.complete){
          // 根据图像重新设定了canvas的长宽
          canvas.setAttribute("width",img.width)
          canvas.setAttribute("height",img.height)
          // 绘制图片
          context.drawImage(img,0,0,img.width,img.height)
        }
      }
    }
  },1)
},

context.drawImage() 方法的参数介绍,可参照 W3school

2.3 绘制矩形

context.strokeStyle = "red"
context.lineWidth = 3;
context.strokeRect(x, y, width, height)

context 同上面的定义

strokeStyle 矩形颜色

lineWidth 矩形边框宽度

x,y,width,height 矩形位置加长宽

2.4 绘制线条

context.moveTo(x1,y1) 
context.lineTo(x2,y2)
context.strokeStyle = "red"
context.lineWidth = 3;
context.stroke()

(x1,y1) (x2,y2) 线条的起点和终点坐标

strokeStyle lineWidth 线条的样式

2.5 绘制文字

context.font = "26px Arial bolder"
context.fillStyle = 'red'
context.fillText(text,x,y)

font fillStyle 文字样式

text 文字内容

x,y 文字显示坐标

2.6 下载图片

// 图片地址和图片名称
downIamge (imgsrc, name) { 
  let image = new Image()
  image.setAttribute('crossOrigin', 'anonymous')
  image.onload = function () {
    let canvas = document.createElement('canvas')
    canvas.width = image.width
    canvas.height = image.height
    let context = canvas.getContext('2d')
    context.drawImage(image, 0, 0, image.width, image.height)
    let url = canvas.toDataURL('image/jpg') 
    let a = document.createElement('a')
    let event = new MouseEvent('click')
    a.download = name
    a.href = url
    a.dispatchEvent(event)
  }
  image.src = imgsrc
},

3 后记

这里只是列出canvas的基础使用,具体的交互和展示还需要更多的设计。

总结

以上所述是小编给大家介绍的Vue使用Canvas绘制图片、矩形、线条、文字,下载图片,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript 类似flash效果的立体图片浏览器
Feb 08 Javascript
js数组中如何随机取出一个值
Jun 13 Javascript
js设置document.domain实现跨域的注意点分析
May 21 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
Aug 04 Javascript
jQuery地图map悬停显示省市代码分享
Aug 20 Javascript
js实现带圆角的两级导航菜单效果代码
Aug 24 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
Aug 31 Javascript
JavaScript 随机验证码的生成实例代码
Sep 22 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
Apr 25 Javascript
微信小程序实现城市列表选择
Jun 05 Javascript
webpack打包优化的几个方法总结
Feb 10 Javascript
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
微信小程序如何修改本地缓存key中单个数据的详解
Apr 26 #Javascript
js验证身份证号码记录的方法
Apr 26 #Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
Apr 26 #Javascript
react高阶组件添加和删除props
Apr 26 #Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 #Javascript
vue 进阶之实现父子组件间的传值
Apr 26 #Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 #Javascript
You might like
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
php实现网站留言板功能
2015/11/04 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
php连接mysql数据库
2017/03/21 PHP
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
js实现表格单列按字母排序
2020/08/12 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
python中的数据结构比较
2019/05/13 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
工伤赔偿协议书
2014/04/15 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
高考升学宴答谢词
2015/01/20 职场文书
经济纠纷起诉状
2015/05/20 职场文书
被委托人身份证明
2015/08/07 职场文书
大学班长竞选稿
2015/11/20 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
tomcat下部署jenkins的方法
2022/05/06 Servers