作者: 糖少

简介

Canvas是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可以进行实时视频处理和渲染。 Canvas是由HTML代码配合高度和宽度属性而定义出的可绘制区域。JavaScript代码可以访问该区域,类似于其他通用的二维API,通过一套完整的绘图函数来动态生成图形。 ​ Mozilla 程序从 Gecko 1.8 (Firefox 1.5)开始支持Canvas, Inernet Explorer 从IE9开始支持。Chrome和Opera 9+ 也支持。

历史来源

苹果内部使用自己MacOS X WebKit推出,供应用程序使用像仪表盘的构件和 Safari 浏览器使用。 后来,有人通过Gecko内核的浏览器 (尤其是Mozilla和Firefox),Opera和Chrome和超文本网络应用技术工作组建议为下一代的网络技术使用该元素

canvas基本使用

  1. canvas标签的使用

  1. canvas方法检查支持性

  1. canvas 绘制图形

坐标系

矩形

fillRect( x , y , width , height)  //填充以(x,y)为起点宽高分别为width、height的矩形 默认为黑色

stokeRect( x , y , width , height) //绘制一个空心以(x,y)为起点宽高分别为width、height的矩形

clearRect( x, y , width , height ) // 清除以(x,y)为起点宽高分别为width、height的矩形 为透明 

路径

beginPath() 新建一条路径一旦创建成功 绘制命令将转移到新建的路径上

moveTo( x, y ) 移动画笔到(x , y) 点开始后面的绘制工作

closePath() 关闭该路径 将绘制指令重新转移到上下文

stroke() 将绘制的路径进行描边

fill() 将绘制的封闭区域进行填充

圆弧

arc( x , y , r , startAngle , endAngle ,  anticlosewise ) // 以(x,y)为圆心 r为半径的圆  绘制startAngle弧度 到endAngle弧度的圆弧 anticlosewise默认为false 即顺时针方向 true为逆时针方向

arcTo( x1 , y1 , x2 , y2 , radius ) //根据 两个控制点 (x1,y1) 和 (x2, y2)以及半径绘制弧线 同时连接两个控制点

贝塞尔曲线

​一次贝塞尔曲线其实是一条直线

二次贝塞尔曲线

三次贝塞尔曲线

二次贝塞尔曲线

quadraticCurveTo( cp1x, cp1y , x ,y )   // (cp1x,cp1y) 控制点    (x,y)结束点

三次贝塞尔曲线

bezierCurveTo( cp1x, cp1y ,cp2x , cp2y ,x , y )//(cp1x,cp1y)控制点1   (cp2x,cp2y) 控制点2  (x,y)结束点

样式添加

fillStyle = color

strokeStyle = color 

//color 可以为颜色值、渐变对象(并非样式!!!!)

lineWidth  = value  线宽

lineCap = type (butt 、 round 、square)线条末端样式   依次是方形、圆形&突出、方形&突出

lineJoin = type (round 、bevel 、 miter)线条交汇处样式 依次是圆形、平角 、 三角形

ctx.setLineDash([ 实际长度 , 间隙长度 ]) //虚线 setLineDash接受数组

ctx.lineDashOffet  //设置偏移量

渐变

var gradient = ctx.createLinearGradient( x1 ,y1 ,x2 ,y2); //线性渐变

var gradient = ctx.createRadialGradient(x1 ,y1 ,r1 ,x2 ,y2 ,r2);//径向渐变

gradient.addColorStop( position , color )// position:相对位置0~1    color:该位置下的颜色

透明度

ctx.globalAlpha = value (0~1)

文本

fillText( text , x , y , [,maxWidth]) 在(x,y)位置绘制text文本  最大宽度为maxWidth(可选)

strokeText( text ,x ,y ,[,maxWidth]) 在(x,y)位置绘制text文本边框  最大宽度为maxWidth(可选)

font = value               eg:"100px sans-serif"  

绘制图片

drawImage( image , x , y , width , height ) image为图片对象、从(x,y)处放置宽高分别为width height的图片

drawImage( image , sx , sy , swidth , sheight ,dx ,dy ,dwidth ,dheight) 切片前四个是定义图像源的切片位置和大小   后四个是定期切片的目标显示位置大小

状态保存 恢复

save()

restore()

动作

translate( x , y ) 将canvas原点的移动到 (x,y)     (save&restore保存初始状态!!!)

rotate( angle ) 顺时针方向旋转坐标轴 angle弧度

scale(x,y) 将图形横向缩放x倍、纵向缩放y倍   ( x、y大于1是放大  小于1为缩放!!!)

全局合成操作

globalCompositeOperation = type; source-over

source-in

source-out

source-atop

destination-over

destination-in

destination-out

destination-atop

xor

copy

裁剪

clip //只显示裁剪区域内部区域  (使用save & restore 存储canvas状态!!!)

动画

clearRect() 清空画布

save&restore 保存恢复canvas状态

定时执行

  • setInterval()
  • setTimeout()
  • requestAnimationFrame()

区别详见:www.cnblogs.com/xiaohuochai…

svg

标签

  • 矩形 rect
  • 圆形 circle
  • 椭圆 ellipse
  • 线 line
  • 折线 polyline
  • 多边形 polygon
  • 路径 path
  • 文本 text

详细标签 : www.runoob.com/svg/svg-ref…

属性

  • 宽度 width
  • 高度 height
  • css样式 style
  • 填充色 fill
  • 边框颜色 stroke
  • 边框宽度 stroke-width
  • 边框首尾 stroke-linecap
  • 线条样式 stroke-dasharray (需要填写线条宽度以及线条间隙 依据顺序填写一个循环)
  • 线条每一段的起始偏移量 stroke-dashoffet
  • 填充透明度 fill-opacity
  • 边框 stroke-opacity
  • 图形填充规则 fill-rule (nonzero evenodd)
  • 动作 transform (中心点为图像左上角,并且只支持2d变换

详情:www.zhangxinxu.com/wordpress/2…

  • translate(10 ,10 ) or translate(10 10)
  • rotate(20) or rotate(20 , x y) x,y为旋转中心点 并且只能是默认deg单位
  • scale(x , y)
  • viewBox 属性

详情:www.zhangxinxu.com/wordpress/2…

  • viewBox = "x , y , width , height"
  • preserveAspectRatio属性

详情:www.zhangxinxu.com/wordpress/2…

矩形 rect

  • 距离左侧位置 x
  • 距离顶部位置 y
  • 矩形产生圆角 rx
  • 矩形产生圆角 ry

圆形 circle

  • 圆点 cx cy
  • 半径 r

椭圆 ellipse

  • 椭圆中心坐标 cx cy
  • 水平半径 rx
  • 垂直半径 ry

直线 line

  • 开始点 x1 y1
  • 结束点 x2 y2

多边形 polygon

  • 定义多边形每个角的x y 坐标 points (eg:points="200,10 250,190 160,210")

曲线 polyline

  • 定义折线起点 拐点 重点 points( eg: points="0,40 40,40 40,80 80,80 80,120 120,120 120,160" )

路径path

  • M = moveto 移动画笔
  • L = lineto 画线
  • H = horizontal lineto 水平线
  • V = vertical lineto 垂直线
  • C = curveto 曲线
  • S = smooth curveto 光滑曲线
  • Q = quadratic Bezier curve 贝塞尔曲线
  • T = smooth quadratic Bezier curveto 光滑贝塞尔曲线
  • A = elliptical Arc 椭圆
  • Z = closepath 结束路径

注意 : 上面的命令大写表示绝对定位,小写表示相对定位

  • 文字
<svg><text x="10" y="20" fill="red" transform="rotate(30,20,40)"></text></svg>

其他超链接、tspan textPath等标签的使用不再详细的讲解

这里会发现svg标签多并且path路径等又很难计算等 推荐使用svg编辑器来生成路径 这里我们以Method Draw编辑器为例

使用教程网址:blog.csdn.net/q1056843325…

英文在线工具网址:editor.method.ac/

中文在线网址:c.runoob.com/more/svgedi…

canvas & svg 性能

「Canvas」玩转的更多相关文章

  1. 零元学Expression Blend 4 - Chapter 9 用实例了解布局容器系列-「Canvas」

    原文:零元学Expression Blend 4 - Chapter 9 用实例了解布局容器系列-「Canvas」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器是Blen ...

  2. 「SCOI2015」小凸玩矩阵 解题报告

    「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...

  3. 「SCOI2015」小凸玩密室 解题报告

    「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...

  4. 摹客iDoc「标注」新玩法!这些细节让你爱不释手(201903-2版本更新)

    哈喽小伙伴们,我们又见面啦!没错,小摹就是来告诉大家:摹客iDoc又双叒叕升级了!这次又上线了许多新玩法,在此之前,小摹先带大家温习一下iDoc以往的知识点: 攻城狮查看标注的利器 —— 标注信息智能 ...

  5. loj#2009.「SCOI2015」小凸玩密室

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

  6. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  7. AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006

    「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...

  8. loj #2006. 「SCOI2015」小凸玩矩阵

    #2006. 「SCOI2015」小凸玩矩阵   题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...

  9. —Libre#2009. 「SCOI2015」小凸玩密室

    #2009. 「SCOI2015」小凸玩密室 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. Inception搭建

    Inception安装Inception是集审核.执行.回滚于一体的一个自动化运维系统,它是根据MySQL代码修改过来的,用它可以很明确的,详细的,准确的审核MySQL的SQL语句,它的工作模式和My ...

  2. MSP430之software development flow

    MSP430 software development flow. 1) The shaded portion highlights the most common development path; ...

  3. 《计算机图形学基础(OpenGL版)》勘误表

    第1版第1次印刷: 所在页码 所在行 原内容 更正为 41 16 k=Δx/Δy k=Δy/Δx 46 6 s-t=2Δy/Δx(xi+1)+2b+2yi-1 s-t=2Δy/Δx(xi+1)+2b- ...

  4. HDU_1907_基础博弈nim游戏

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  5. C 预处理程序指令(CPP)

    #include 文件 提供的东西 stdio 提供 FILE.stdin.stdout.stderr 和 fprintf() 函数系列 stdlib 提供 malloc().calloc()和 re ...

  6. openstack--rabbitmq

    一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们. 消息传 ...

  7. PS学习列表

    1 去水印 祛痘 祛斑 2 新建画布,素材拖到ps中,图层 3 钢笔抠图,直线点,圆弧拖,遇到拐角按alt,ctrl+回车键将扣的图变为选区,ctrl+j复制一层上来 4 证件照换底

  8. [Ynoi2015]即便看不到未来

    题目大意: 给定一个序列,每次询问,给出一个区间$[l,r]$. 设将区间内的元素去重后重排的数组为$p$,求$p$中长度为$1\sim 10$的极长值域连续段个数. 长度为$L$的极长值域连续段的定 ...

  9. [USACO15FEB]Censoring (Silver)

    WA了一万次.... 然后发现多输出了一个空格 我#$%^& 启示我们输出字符的时候应该输出ASCII码看一下.... 然后本题可以用烤馍片算法,每次匹配完以后看看当前最后一位的nxt数组的值 ...

  10. 读取linux服务器内带格式文件,转为json字符串

    工具类方法:ReadTextUtil package com.dc.health.platform.common.utils; import com.alibaba.fastjson.JSONObje ...