Vue+Canvas绘图使用的讲解

目录
  • Vue使用Canvas绘图
    • 1、前言
    • 2、实现原理
  • Vue使用Canvas的小demo
    • 顺便总结一波

Vue使用Canvas绘图

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>
 
//为了突出画布效果可以在css中设置一个边框。
#mycanvas {
    border: 1px solid rgb(199, 198, 198);
}

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

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
},

Vue使用Canvas的小demo

今天接到一个需求,在vue+element管理后台中新增一个保存canvas图片的需求,所以先写了一个小demo

// html中
<div class="contain">
	<canvas id="myCanvas" width="500" height="500" ref="myCanvas"></canvas>
</div>
// js中
drowCanvas () {
    let myCanvas = this.$refs.myCanvas
    //画布的宽高
    let Cwidth = 500
    let CHeight = 500
    // 创建一个画布上绘图的环境
    var ctx = myCanvas.getContext('2d')
    // 一般情况下,canvas的背景颜色是透明的,当生成图片的时候也是透明
    // 如果希望图片有个背景颜色,可以创建一个框高100%的矩形
    // 画布的最底端-这样就可以有个背景颜色
    ctx.fillStyle = '#fff'
    ctx.fillRect(0, 0, Cwidth, CHeight);

    //设置颜色也可以适用rgba
    ctx.fillStyle = 'rgba(0,0,0,0.9)'
    //绘制一个矩形的边框(x, y, width, height)
    ctx.strokeRect(50, 100, 100, 100)

    // 可以在页面插入文字
    ctx.fillStyle = '#333'

    // 三个参数-文字,横坐标-纵坐标
    ctx.font = '16px Arial'
    ctx.fillText('今天是个好日子', 50, 50);
    ctx.fillText('心想的事儿都能成', 50, 80);

    // 绘制一个实心的方块
    ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
    ctx.fillRect(200, 30, 80, 50);

    // 还可以插入图片
    // 首先创建一个图片标签
    // 然后插入图片
    let imgObj = new Image()
    imgObj.src = 'http://t8.baidu.com/it/u=3571592872,3353494284&fm=79&app=86&f=JPEG?w=1200&h=1290'
    // let imgUrl = this.imgOnload(imgObj)
    imgObj.onload = function () {
    	// 关于坐标问题
    	// 一般绘制图片,只是画上去,这里外层canvas是500*500,相当于居中了,只是
    	// 被裁剪了
    	// 从图片的593,327 坐标开始截图,截取 500,500 这么大
		// 然后将截取的图片,从canvas 100,100开始画, 缩放 300,300 这么大!
        ctx.drawImage(imgObj, 593,327,500,500,100,100,300,300)
    }

    // 生成图片(图片的格式)
    let imageUrl = myCanvas.toDataURL("image/png", 0.5);
    // base64图片地址就获取到了
    // 现实中存在两种情况,一个显示页面中,点击下载,这个就简单了,可以利用a标签进行下载
    //还有一种情况就是,图片base64地址生成后,自动下载
    // 调用方法下载canvas
    this.downloadFile(imageUrl, '1.png')
},
// 创建下载图片事件
downloadFile(data, filename) {
   //创建一个具有指定的命名空间URI和限定名称的元素
   var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
   save_link.href = data;
   save_link.download = filename;
   // 绑定下载事件
   var event = document.createEvent('MouseEvents');
   event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false,         false, false, 0, null);
   save_link.dispatchEvent(event);
},

绘制出来的canvas图片有点丑

不过还是只是样式问题,下载也可以正常试用,只需要吧代码套到具体的业务需求里面去就可以了

顺便总结一波

绘制图片的时候传参的问题

	/*3参数*/
    /*图片对象*/
    /*绘制在画布上的坐标 x y*/
    //ctx.drawImage(image,100,100);

	/*5个参数*/
    /*图片对象*/
    /*绘制在画布上的坐标 x y*/
    /*是图片的大小  不是裁剪  是缩放*/
    //ctx.drawImage(image,100,100,100,100);
    /*9个参数*/
    /*图片对象*/
    /*图片上定位的坐标  x y */
    /*在图片上截取多大的区域  w h*/
    /*绘制在画布上的坐标 x y*/
    /*是图片的大小  不是裁剪  是缩放*/
    ctx.drawImage(image,400,400,400,400,200,200,100,100);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Vue Canvas实现电子签名

    最近再做移动端电子签名,Vue+Canvas实现,移动端.PC端均可,也可以从github下载 . 我在做这个功能的时候参考了 这个代码,但是在移动端光标与实际划线有偏移,我在我的代码中修正了这个问题. 代码 <template>       <section class="signature">           <div class="signatureBox">               <div class=&q

  • Vue3+Canvas实现简易的贪吃蛇游戏

    目录 前言 规则 思路 流程图 代码实现 技术栈 基本变量定义 初始化 食物绘制 蛇头/蛇身绘制 碰撞算法.边界条件 积分计算.暂停,继续等功能 后记 前言 贪吃蛇作为一个经典的小游戏,是很多人儿时的记忆,当时的掌机.诺基亚手机里面都有它的身影,随着时间流逝,当年的我们已经变成大人模样,玩着王者,吃鸡等大型游戏:贪吃蛇这种小游戏已经吊不起我们的兴趣了,不过如果你是一名程序员,那还是建议实现一下,毕竟作为 leetcode 353 算法题你总不想在面试的时候遇到它却不会吧. 本文让我们来复刻一下这

  • Vue+canvas实现视频截图功能

    开发过程中遇到一个实际问题,上传的视频需要提供视频封面(视频封面必填).封面可以自己制作并上传,但是这样需要脱离网站,用其他方式制作封面,使用体验并不友好,因此第一个想到的方案是:上传视频时,若人员未上传封面,自动截取视频第一帧作为封面,但是这样会出现一种情况:视频第一帧是黑色,导致封面为黑色.因此考虑视频上传后,在播放中由人员自行截取画面作为视频封面. 简单效果如图: 前端代码如下: <template>   <div>     <video src="https

  • vue项目中canvas实现截图功能

    本文实例为大家分享了vue项目中canvas实现截图功能的具体代码,供大家参考,具体内容如下 实现效果: 整理一下最近在vue项目中做的一个截图功能(只能够截取图片),即用鼠标在画布上进行框选截取. 思路大概如下:做一个弹窗,打开弹窗的时候传入要截的图,接下来在这个窗口里面,点击截图按钮,开始截图,点击取消按钮,取消截图. 窗口里面的html主要是三个部分,一个是可截图区域,一个是截取图片的回显,一个是操作按钮(截图按钮和取消截图按钮). 部分html: <!--截图区域--> <div

  • VUE使用canvas实现签名组件

    本文实例为大家分享了VUE使用canvas实现签名组件的具体代码,供大家参考,具体内容如下 效果如下: <template>   <div class="sign">     <div class="content">       <canvas id="canvas" :width="width" :height="height"/>     </di

  • Vue+Canvas制作简易的水印添加器小工具

    目录 前言 效果展示 实现功能 实现思路 总结 前言 随着搬运工的逐渐增加,原创作者的利益收到了极大的影响.所以给图片或视频加上水印显得极其重要,他可以有效的维护原创作者的版权防止盗版.本文分享一个由canvas和vue.js制作的图片水印添加器. 效果展示 实现功能 自定义水印的文字及颜色,水印的位置,旋转角度,大小,透明度,是否重复显示,以及选择为重复时可以选择文字之间的水平间距和垂直间距,在设置为合适的图片时点击下载按钮即可下载得到完成图.如果觉得效果不好也可以点击重置按钮瞬间清屏.同时还

  • Vue+Canvas绘图使用的讲解

    目录 Vue使用Canvas绘图 1.前言 2.实现原理 Vue使用Canvas的小demo 顺便总结一波 Vue使用Canvas绘图 1.前言 图片储存在后台中,根据图片的地址,在vue页面中,查看图片,并根据坐标标注指定区域. 由于浏览器的机制,使用window.location.href下载图片时,并不会保存到本地,会在浏览器打开. 2.实现原理 2.1 绘制画布 <el-dialog     title="查看图片"     :visible.sync="dia

  • vue下canvas裁剪图片实例讲解

    由于时间关系 代码没有做整理大家有什么不懂得可以留言: 代码的主题思路备注中都有 大家可以看看 我的博客中还有关于canvas绘制矩形的文章有需要的可以看一下: HTML代码: 第一行的canvas为裁剪后展示用:div中的canvas存放原有尺寸的图片 <canvas id="canvasImg1" style=" position: absolute; margin: 2px 0 0 0"></canvas> <div id=&qu

  • JavaScript基础——使用Canvas绘图

    最近在学习Canvas画图的方法,最近有时间做了个整理,如下: 1.基本用法 要使用<canvas>元素,必须先设置其width和height属性,指定可以绘图的区域大小,出现在开始后结束标签中的内容是后备信息,如果浏览器不支持<canvas>元素,就会显示这些信息.例如: <canvas id="drawing" width="200" height="200">A Drawing of something&

  • 基于vue+canvas的excel-like组件实例详解

    a vue component,基于vue的表格组件,主要解决大数据量的表格渲染性能问题,使用canvas绘制表格,同时支持类似excel的批量选中,复制黏贴删除,实时编辑等功能. vue-grid-canvas Install NPM / Yarn Install the package: npm install vue-canvas-grid --save Then import it in your project import Vue from 'vue' import Grid fro

  • vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)

    前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给定合理的帧数,不断的清除画布,再重绘图形,即呈现出动画效果. 让我们先看下效果 说明:此gif清晰度很低,因为转成gif图的时候,质量受损,帧数减少,所以倒计时转到红色时候看起来变的很模糊.但是实际在浏览器上效果全程都是很清晰和连贯的 使用 npm npm install vue-canvas-co

  • vue+canvas实现移动端手写签名

    本文实例为大家分享了vue+canvas实现移动端手写签名的具体代码,供大家参考,具体内容如下 <template> <div class="sign"> <div class="header"> <i class="el-icon-arrow-left backImg" @click="goBack"></i> <span class="title&

  • vue+canvas实现拼图小游戏

    利用 vue+canvas 实现拼图小游戏,供大家参考,具体内容如下 思路步骤 一个拼图拼盘和一个原图参照 对原图的切割以及随机排序 通过W/A/D/S或上下左右进行移动 难度的自主选择 对拼图是否完成的判定 JS实现部分 数据分析 row:拼图的总行数:column:拼图的总列数. (用来设置拼图难度,也是每个拼图块宽高的设置规则) pic[{x,y,row,column,index}]:小拼图的集合,其内元素为小拼图的数据结构. (x.y:拼图块在canvas的绘制规则,初始化后不会进行改变

  • Vue基本指令实例图文讲解

    Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合.另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动. 一. v-on指令 1. 基础用法 v-on是事件监听的指令, 下面来看简单用法 <!DOCTYPE html> <html lang="en"&

  • R语言绘图布局实例讲解

    在R语言中,par 函数可以设置图形边距,其中oma 参数设置outer margin, mar 参数设置margin, 这些边距有什么不同呢,通过box函数可以直观的看到 box 默认在当前图形绘制边框,第一个参数which = "plot", 所以在当前图形上绘制边框 which 的值除了plot 之外,还可以选择 figure, inner, outer 接下来分别用不同的值测试一下,为了区分,为不同的边框设置不同的颜色和类型,代码如下: attach(mtcars) plot(

  • VUE+Canvas实现简单五子棋游戏的全过程

    前言 在布局上,五子棋相比那些目标是随机运动的游戏,实现起来相对简单许多,思路也很清晰,总共分为: (1)画棋盘: (2)监听点击事件画黑白棋子: (3)每次落子之后判断是否有5子相连,有则赢. 最复杂的恐怕就是如何判断五子棋赢了,那么就先从简单的开始,画个棋盘吧~ 1.画棋盘 棋盘很简单,我们画个15*15的棋盘,横线竖线相交错: drawCheckerboard() { // 画棋盘 let _this = this; _this.ctx.beginPath(); _this.ctx.fil

随机推荐