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来定义类的规范小结
Nov 19 Javascript
javascript定义函数的方法
Dec 06 Javascript
JavaScript实现的in_array函数
Aug 27 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
BootStrap中Tab页签切换实例代码
May 30 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
原生js实现类似fullpage的单页/全屏滚动
Jan 22 Javascript
jQuery基本筛选选择器实例代码
Feb 06 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
Jun 19 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
Jul 24 Javascript
Node做中转服务器转发接口
Oct 18 Javascript
vue实现五子棋游戏
May 28 Javascript
微信小程序如何修改本地缓存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序列化操作方法分析
2016/09/28 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
Python的另外几种语言实现
2015/01/29 Python
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
python制作抽奖程序代码详解
2021/01/15 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
办公室主任竞聘演讲稿
2014/05/15 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
出租车拒载检讨书
2015/01/28 职场文书
三峡导游词
2015/01/31 职场文书
庆七一活动简报
2015/07/20 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
详解java如何集成swagger组件
2021/06/21 Java/Android