Canvas 2D绘图
html5中Canvas为什么要用getContext(2d)

html5中Canvas为什么要⽤getContext(2d)HTML DOM getContext() ⽅法HTML DOM Canvas 对象定义和⽤法getContext() ⽅法返回⼀个⽤于在画布上绘图的环境。
语法Canvas.getContext(contextID)参数参数 contextID 指定了您想要在画布上绘制的类型。
当前唯⼀的合法值是 "2d",它指定了⼆维绘图,并且导致这个⽅法返回⼀个环境对象,该对象导出⼀个⼆维绘图 API。
提⽰:在未来,如果 <canvas> 标签扩展到⽀持 3D 绘图,getContext() ⽅法可能允许传递⼀个 "3d" 字符串参数。
返回值⼀个 CanvasRenderingContext2D 对象,使⽤它可以绘制到 Canvas 元素中。
描述返回⼀个表⽰⽤来绘制的环境类型的环境。
其本意是要为不同的绘制类型(2 维、3 维)提供不同的环境。
当前,唯⼀⽀持的是 "2d",它返回⼀个 CanvasRenderingContext2D 对象,该对象实现了⼀个画布所使⽤的⼤多数⽅法。
举个简单的例⼦,画⼀个五⼦棋棋盘为例:<canvas id="chess" width="450px" height="450px"></canvas>var chess = document.getElementById("chess");var context = chess.getContext("2d");context.strokeStyle = "#0A0A0A";var logo = new Image();logo.src = "image/chess.jpg";//图⽚加载完毕后的回调⽅法logo.onload = function(){//画键盘context.drawImage(logo, 0, 0, 450, 450);drawChessBorad();}var drawChessBorad = function(){for(var i = 0; i < 15; i++){context.moveTo(15 + i*30, 15);context.lineTo(15 + i*30, 435);context.moveTo(15, 15 + i*30);context.lineTo(435, 15 + i*30);context.stroke();}}。
HTML5Canvas学习笔记(canvas绘制线条、矩形、多边形、圆、自定义图像)

HTML5Canvas学习笔记(canvas绘制线条、矩形、多边形、圆、⾃定义图像)⼀、对 canvas 的理解 <canvas>标签是 HTML5 中的新标签,像所有的 dom 对象⼀样它有⾃⼰本⾝的属性、⽅法和事件。
canvas 是⽤来在⽹页上绘制图形的(我们通常称之为画布),canvas 只是图形容器,需要使⽤ js 脚本来绘制图形,可以绘制线条、矩形、多边形、圆形、圆环、组合图形、⽂字、⾃定义图像等。
浏览器⽀持注释:Internet Explorer 8 以及更早的版本不⽀持 <canvas> 标签。
Internet Explorer 9+, Firefox, Opera, Chrome 以及 Safari ⽀持 <canvas>标签。
⼆、基本⽅法绘图环境: 语法 Canvas.getContext(contextID) 参数contextID指定了您想要在画布上绘制的类型。
当前唯⼀的合法值是 "2d",它指定了⼆维绘图,并且导致这个⽅法返回⼀个环境对象,该对象导出⼀个⼆维绘图API。
【注】:getContext() ⽅法返回⼀个⽤于在画布上绘图的环境。
getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的⽅法。
绘制图形样式style(⼀般在绘制图形前先进⾏样式设定):context.fillStyle //填充样式context.strokeStyle //笔触颜⾊context.lineWidth //边框宽度绘制图像有两种⽅法:context.fill() //填充context.stroke() //绘制边框颜⾊的表⽰⽅式:颜⾊名称:"red" "green" "blue"⼗六进制颜⾊值: "#FFFFFF"三⾊值:rgb(1-255,1-255,1-255)四⾊值:rgba(1-255,1-255,1-255,透明度)三、使⽤ <canvas> Step1: ⾸先在html页⾯中添加<canvas>标签,规定好画布的id和尺⼨,代码如下:<!--规定了canvas元素的id名称为canvas、宽度为400px、⾼度为300px--><canvas id="myCanvas" width="400" height="300"/> Step2: 通过JavaScript来进⾏绘制: ⽅法⼀:<!--⽤⾕歌浏览器,获取canvas对象时需要先加载对象,所以要把该段代码放到body中,在js⽂件⾥进⾏绘制图像--><script src="canvas.js"></script> ⽅法⼆:<!--或者直接在body⾥编写代码--><script type="text/javascript"> var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); context.fillStyle = "#FF0000"; context.fillRect(50,50,150,100);</script> 图解: Step3: Step2 分步骤: 通过id来捕获canvas元素 创建 context 对象 指定 fillStyle 填充颜⾊为红⾊指定 fillRect :fillRect(起始点x轴坐标, 始点y轴坐标, 宽度, ⾼度);四、实例1--绘制线条: context.moveTo(x,y) context.lineTo(x,y)x:x坐标y:y坐标起点 moveTo 的点到终点 lineTo 的点之间画⼀条直线如果没有moveTo那么第⼀次lineTo的效果和moveTo⼀样每次lineTo后如果没有moveTo,那么下次lineTo的开始点为前⼀次lineTo的结束点1 1 // 绘制对⾓线2 2 function demo1(id){3 3 var canvas = document.getElementById(id);4 4 var context = canvas.getContext("2d");5 5 6 6 context.strokeStyle = "#ff0000";7 78 8 context.moveTo(0,0);9 9 context.lineTo(200,100);10 10 context.stroke();11 11 }View Code实例结果:1// 绘制直⾓三⾓形2function demo1(id){3var canvas = document.getElementById(id);4 var context = canvas.getContext("2d");5 6 context.strokeStyle = "#ff0000";78 context.lineTo(20, 20);9 context.lineTo(20, 70);10 context.lineTo(70, 70);11 context.lineTo(20, 20);12 context.stroke();13 }View Code【注】:1. 三⾓形有三个点,但在连线的时候还需要连回顶点;2. 最后⼀定记得加上 stroke(); 初学时容易犯这个⽑病,这相当于你把点定好了,却没⽤线连起来,岂不......实例结果:CSS属性中有⼀圆⾓设置 radius,canvas画线段也要达到这种圆⾓匾额效果,我么也有相应的办法: lineJoin 属性,可以设置线的交汇处的样式,lineJoin有3个属性值:miter(尖⾓,默认),bevel(斜⾓),round(圆⾓) lineCap 属性,定义线条的端点。
awtk canvas用法

awtk canvas用法AWTK(Any Widget Toolkit)是ZLG开源的一个跨平台GUI开发框架。
在AWTK中,canvas是一个用于绘制图形的组件,它支持基本的2D绘图操作,如线条、形状、文本和图像等。
以下是在AWTK中使用canvas的基本步骤:1、创建canvas对象:在需要使用canvas的地方创建一个canvas_t对象。
例如,在一个窗口或控件的事件处理函数中,可以这样创建:ccanvas_t* cnv = (canvas_t*)target;这里的target通常是事件源,即触发该事件的窗口或控件。
2、设置颜色和线宽:在开始绘制之前,你需要设置好画笔的颜色和线宽。
你可以使用canvas_set_fill_color()和canvas_set_stroke_color()来设置填充色和边框色,使用canvas_set_line_width()来设置线宽。
3、绘制图形:AWTK提供了各种绘制函数,如canvas_draw_point(), canvas_draw_line(), canvas_draw_rect(), canvas_draw_text()等。
根据你的需求调用这些函数即可。
4、更新显示:当你完成所有绘制后,需要调用widget_update()函数来更新显示。
对于窗口,你可以直接调用window_invalidate()。
5、清理资源:当不再需要canvas时,记得释放其占用的资源。
这通常通过调用canvas_destroy()函数实现。
以下是一个简单的示例,展示如何在AWTK中使用canvas绘制一条直线:cstatic void on_paint(widget_t* widget, canvas_t* canvas){/* 设置颜色 */canvas_set_fill_color(canvas, 0x808080);canvas_set_stroke_color(canvas, 0xFF0000);/* 绘制一条直线 */canvas_draw_line(canvas, 10, 10, 100, 100);/* 更新显示 */window_invalidate((window_t*)widget);}在这个例子中,我们首先设置了背景色和边框色,然后在(10, 10)和(100, 100)之间绘制了一条直线,最后更新了窗口的显示。
canvas实现画画功能

canvas实现画画功能canvas模拟画画利⽤canvas和获取移动⿏标的坐标点模拟电脑⾃带画画功能,可画直线,曲线,可改变画笔颜⾊和粗细⼀.代码<!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"><title></title><style>body{margin: 0;padding: 0;}canvas{border: 1px solid black;}#sel_col li{list-style: none;width: 30px;height: 30px;border-radius:30px ;float: left;margin-left: 10px;cursor: pointer;}#sel_wid{width: 200px;margin-left: 200px;}#sel_wid li{list-style: none;background: black;float: left;margin-left: 10px;cursor: pointer;}#list{margin-left: 100px;}#list li{list-style: none;float: left;width: 100px;height: 30px;border-radius:5px;background: grey;margin-left: 10px;color: white;line-height: 30px;text-align: center;}#list li:hover{cursor: pointer;background: orangered;}</style></head><body><canvas width="800" height="600" id="canvas1"></canvas><ul id="sel_col"><li></li><li></li><li></li><li></li></ul><ul id="sel_wid"><li></li><li></li><li></li><li></li></ul><ul id="list"><li id='a1'>画笔</li><li id='a2' >直线</li><li id='a3' >清空</li><li id="clear">橡⽪</li></ul></body></html><script>window.onload=function() {var v_canvas=document.getElementById("canvas1");var a1=document.getElementById("a1");var a2=document.getElementById("a2");var clear=document.getElementById("clear");var context=v_canvas.getContext("2d");var cha={col:'red',wid:5,last:'red'};document.onmousedown = function (e) {if(a1.style.backgroundColor=='red'||clear.style.backgroundColor=='red'){ e = e || window.e;if (e.button == 0) {context.beginPath();context.moveTo(e.pageX, e.pageY);document.onmousemove = function (e) {context.lineTo(e.pageX, e.pageY);context.strokeStyle = cha.col;context.lineWidth = cha.wid;context.stroke();};document.onmouseup = function (){context.closePath();document.onmousemove = function (){return false;}}}}else if(a2.style.backgroundColor=='red'){e = e || window.e;if (e.button == 0) {context.beginPath();context.moveTo(e.pageX, e.pageY);document.onmousemove = function (e) {};document.onmouseup = function (e){context.lineTo(e.pageX, e.pageY);context.strokeStyle = cha.col;context.lineWidth = cha.wid;context.stroke();context.closePath();document.onmousemove = function (){return false;}}}}};var sel_col=document.getElementById('sel_col').children;var sel_wid=document.getElementById('sel_wid').children;var list=document.getElementById('list').children;for(var k=0;k<list.length;k++){list[k].c=k;list[k].onclick=function(){list[this.c].style.backgroundColor='red';if(this.c==2){var v_canvas=document.getElementById("canvas1");var a1=document.getElementById("a1");var context=v_canvas.getContext("2d");context.clearRect(0,0,800,600);}if(this.c==3){st=cha.col;cha.col='white';}for(var s=0;s<list.length;s++){if(this.c!=s){list[s].style.backgroundColor='grey'; }if(this.c!=3){cha.col=st;}}}}var arr=['blue','green','red','orange'];var arr1=[5,10,15,20];for(var i=0;i<arr.length;i++){sel_col[i].a=i;sel_col[i].style.backgroundColor=arr[i];sel_col[i].onclick=function(){if(clear.style.backgroundColor!='red'){ cha.col=arr[this.a];}}}for(var j=0;j<arr1.length;j++){sel_wid[j].b=j;sel_wid[j].style.width=arr1[j]+'px';sel_wid[j].style.height=arr1[j]+'px';sel_wid[j].style.borderRadius=arr1[j]+'px'; sel_wid[j].onclick=function(){cha.wid=arr1[this.b];}}};</script>⼆.⽰例。
canvas用法

canvas用法Canvas是一种用来作图形和图像绘制的视图API,它可以在2D 和3D的空间中进行绘制,可以被用来做任意的图形绘制和图像处理。
Canvas可以被用来创建动态的、交互的图形效果,比如网页版的绘画工具、照片滤镜、虚拟画板和物体跟踪等。
Canvas的用法可以分为两类:一类是绘图相关的,另一类是图像处理相关的。
绘图相关可以将Canvas用在2D和3D空间,用于做绘画、游戏开发、投射技术、动画和许多其他方面;图像处理相关可以将Canvas用在图像处理上,像色彩变换、图像改变、图像分析、计算机视觉等。
1、Canvas常用的2D绘图API在2D绘图中,Canvas有许多常用的API,可以用来绘制图形和动画,譬如矩形、圆形、线条、文字、图片和阴影等。
以下是一些常用的API:tdrawImage():用于绘制图像,可以绘制图片、视频或者canvas 元素;tfillRect():用于绘制矩形,可以通过指定位置和尺寸来绘制; trect():用于定义矩形,可以指定位置和尺寸,在fillRect()中会用到;tfill():用于填充路径,使用时要先使用beginPath()和closePath();tbeginPath():用于开始一个新的路径,在绘制路径前必须使用;tclosePath():用于关闭一个路径,在绘制路径后必须使用;tarc():用于绘制圆形,可以指定圆心、半径和弧度;tstroke():用于画线,可以指定线宽、色彩和样式;tfillText():用于绘制文字,可以指定字体、字号、文字内容和位置等;ttransform():用于实现坐标系变换,可以改变坐标系的原点和尺寸;tsave():保存当前的绘图状态,包括颜色及其它相关图形状态; trestore():恢复之前存储的绘图状态,恢复到保存时的画布状态;2、Canvas常用的图像处理API图像处理在Canvas中也有专门的API,可以用来对图像进行处理,比如色彩变换、图像改变、图像分析、计算机视觉等。
canvas.rotate的用法

在HTML5中,Canvas元素允许您使用JavaScript绘制图形,图像和动画。
rotate()方法是Canvas 2D上下文中用于旋转绘图的一个重要方法。
它用于按照给定的角度旋转画布的坐标系统。
以下是rotate()方法的详细用法:
语法:
参数:
•angle:要旋转的角度,单位为弧度。
正值表示逆时针旋转,负值表示顺时针旋转。
示例用法:
在上面的例子中,我们首先使用fillRect()方法在Canvas上绘制一个红色的矩形。
然后,使用rotate()方法将画布逆时针旋转45度(以弧度为单位)。
最后,我们再绘制一个蓝色的矩形,这次是在旋转后的坐标系统中进行绘制。
这个新的矩形将根据旋转后的坐标系统进行定位,因此将会出现在不同的位置。
基于WebGL的Canvas元素2D绘制加速
2016年软 件2016, V ol. 37, No. 12作者简介: 谢贤博(1992-),男,研究生,计算机软件与应用;邓红艳,教授,空军指挥学院,研究方向:模拟仿真专业;张宇,工程师,中国电子设备系统工程公司研究所,研究方向:指挥自动化专业。
通讯联系人: 聂芸,高级工程师,主要研究方向:图形图像处理技术。
基于WebGL 的Canvas 元素2D 绘制加速谢贤博,聂 芸,邓红艳,张 宇(华北计算技术研究所 地理信息与图形图像技术研发中心,北京 邮编 100083)摘 要: HTML5中的Canvas 元素极大地丰富了网页所能呈现的图像信息。
Canvas 元素具有两种绘图模式:Canvas2D 接口类似于画布,用于渲染2D 内容,使用简单,可由浏览器负责硬件加速;WebGL 接口类似于OpenGL-ES ,负责渲染3d 场景,使用复杂,但可以直接使用硬件。
当绘制的2D 基本图元数量较多时,实时性要求高时,Canvas2D 接口性能不足。
本文将以WebGL 为基础,提出一种优化思想,通过缓冲技术、常量属性化技术、帧间缓存技术、DMA 技术,加速不同2D 基本图元的绘制。
本文对不同的2D 图元绘制方式性能进行对比实验,证实以WebGL 加速Canvas 的2D 绘制是可行并且有效的,并且给出一个实际应用实例。
关键词: 计算机图形学;WebGL 绘制;设计与实现;高性能渲染;HTML5中图分类号: TP391.41 文献标识码: A DOI :10.3969/j.issn.1003-6970.2016.12.031本文著录格式:谢贤博,聂芸. 基于WebGL 的Canvas 元素2D 绘制加速[J]. 软件,2016,37(12):146-152Accelerated 2D Rendering for Canvas Element based on WebGLXIE Xian-bo, NIE Yun, DENG Hong-yan, ZHANG Yu(North China Institute of Computer Technology, Beijing 100083, China )【Abstract 】: HTML5 introduced canvas element which significantly enhanced the graphic expressiveness of web pages. Two rendering context is based on Canvas element. Canvas 2D context is used for rendering 2D content. WebGL con-text is a subset of OpenGL-ES aiming at rendering 3d content with scripts directly controlling hardware. Canvas 2D context is simple to use but cannot handle massive 2D objects in time. This paper discusses about the practice of accel-erating 2D drawings using WebGL based on buffering, uniform-attributifying, caching and direct-memory-accessing techniques. Experiments and example prove the efficiency of WebGL 2D acceleration.【Key words 】: Computer graphics; WebGL rendering; Design and implementation; High-performance rendering; HTML50 引言随着HTML5的普及,网页可以承载更多以往桌面或移动客户端的内容。
HTML5之Canvas绘图——使用Canvas绘制图形的基本教程
HTML5之Canvas绘图——使⽤Canvas绘制图形的基本教程HTML5⽕的正热,最近有个想法也是要⽤到HTML的相关功能,所以也要好好学习⼀把。
好好看了⼀下Canvas的功能,感觉HTML5在客户端交互的功能性越来越强了,今天看了⼀下Canvas绘图,下边是⼏个实例,记下以备后⽤。
1、使⽤Canvas绘制直线:<!doctype html><html><head><meta charset="UTF-8"></head><style type="text/css">canvas{border:dashed 2px #CCC}</style><script type="text/javascript">function $$(id){return document.getElementById(id);}function pageLoad(){var can = $$('can');var cans = can.getContext('2d');cans.moveTo(20,30);//第⼀个起点cans.lineTo(120,90);//第⼆个点cans.lineTo(220,60);//第三个点(以第⼆个点为起点)cans.lineWidth=3;cans.strokeStyle = 'red';cans.stroke();}</script><body onload="pageLoad();"><canvas id="can" width="400px" height="300px">4</canvas></body></html>这⾥⽤到的两个API⽅法,moveTo和lineTo分别是线段的起点和终点坐标,变量为(X坐标,Y坐标),strokeStyle、stroke分别路径绘制样式和绘制路径。
canvascontext.draw原理
主题:canvascontext.draw原理一、canvas简介Canvas是HTML5新增的标签,用于在网页上绘制图形、动画和其他视觉效果。
Canvas可以通过Javascript来动态生成图形,实现丰富的交互效果。
在Canvas中,使用2D上下文(context)来绘制图形,而canvascontext.draw是其中一个重要的绘制方法。
二、canvascontext.draw的作用canvascontext.draw方法是用于在Canvas上绘制图形的函数,可以绘制路径、填充颜色、描边等操作。
通过canvascontext.draw方法,可以实现各种复杂的图形绘制,包括直线、曲线、矩形、圆形等。
三、canvascontext.draw的原理canvascontext.draw方法的原理主要包括以下几个方面:1. 创建绘制路径在使用canvascontext.draw方法之前,需要先创建绘制路径。
绘制路径是指定义图形的轮廓,包括起点、终点以及各个控制点。
通过canvas提供的路径绘制方法,可以创建直线、曲线、矩形、圆形等各种形状的路径。
2. 设置绘制样式在绘制路径之后,需要设置绘制样式,包括填充颜色、描边颜色、线条粗细、阴影效果等。
通过canvas提供的样式设置方法,可以对绘制路径进行填充或描边,并实现丰富的视觉效果。
3. 调用canvascontext.draw方法当路径和样式设置完成之后,就可以调用canvascontext.draw方法来进行实际的绘制操作。
canvascontext.draw方法会按照路径的定义和样式的设置,绘制出具体的图形效果。
4. 渲染到Canvas上绘制完成的图形会被渲染到Canvas上,展现给用户。
用户可以在Canvas上看到绘制出的图形,并与之进行交互。
四、canvascontext.draw方法的参数canvascontext.draw方法可以接受多个参数,用于指定绘制的具体内容和样式。
前端开发知识:如何使用Canvas和GPU加速来提高渲染性能
前端开发知识:如何使用Canvas和GPU加速来提高渲染性能Canvas是HTML5提供的一个重要的图形绘制API,被广泛应用于图形、动画和游戏开发等领域。
它具有跨浏览器、跨设备、高度可定制等特性,同时也具备一定的图形处理能力。
但是,随着图形、动画和游戏的复杂度越来越高,Canvas的性能问题也越来越凸显。
因此,本文将探讨如何使用Canvas和GPU加速来提高渲染性能。
一、Canvas渲染原理Canvas是HTML5提供的一种绘图API,它可以在Web页面上绘制2D图形,也可以实现一些复杂的动画效果,同时也有WebGL支持,可以在Canvas上实现3D图形的绘制。
Canvas的核心是canvas元素,使用JavaScript编写绘图指令,将其绘制到canvas元素上。
简单来说,canvas是一块画布,开发者通过JavaScript绘图指令将一些图形绘制到画布上,最终呈现在Web页面上。
Canvas有一些内置的API,如:绘制直线、绘制文本、填充颜色、绘制图像等,也支持开发者扩展其他的API。
二、Canvas性能瓶颈虽然Canvas具有很多优点,但是它也存在一些性能问题。
这些问题主要来自于以下三个方面:1、CPU计算量大:由于Canvas是基于JavaScript编写的,在绘制图形时需要进行大量的计算和处理。
因此,当Canvas中的元素变得越来越多时,CPU的计算量也会越来越大,导致渲染速度变慢。
2、内存消耗高:由于Canvas是基于像素绘制的,每一个像素点都需要一个内存单元来储存,因此,在绘制图形时占用的内存也会随着图形的复杂度而增加。
3、绘制效率低:由于Canvas需要通过JavaScript代码实现图形的绘制,而JavaScript在性能上相对较弱,因此,Canvas的绘制效率也相对低下。
三、GPU加速原理GPU(Graphics Processing Unit)是专门负责图形计算的处理器,相比于CPU具备更强的并行计算能力和更高的浮点运算效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
绘图的时候 drawImage(img, 0 – width / 2, 0 – height / 2);
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用
• • • • • 裁剪 图像叠加 坐标变换 像素计算 动画
高级应用——像素计算
函数 getImageData(x, y, width, height) 说明 读取画板中指定区域的像素数据 示例 context.getImageData(0, 0, 100, 300)
destination:画布上已有的图像
含义 默认值,在destination之上绘制source 在两个图像的交集中绘制source,并清除交集以外区域
source-out
source-atop destination-over destination-in destination-out destination-atop lighter darker xor
高级应用——坐标变换
特别注意: 1. 调用translate,scale,rotate方法时,都是以当前的二维变换矩阵进 行计算,即调用的先后顺序会影响最终结果。 2. 如果要还原到初始的坐标系,调用setTransform(1, 0, 0, 1, 0, 0)。 3. 等价代换:
translate(dx, dy) = setTransform(1, 0, 0, 1, dx ,dy); scale(sx, sy) = setTransform(sx, 0, 0, sy, 0, 0); rotate(deg) = setTransform(cos(deg),-sin(deg),sin(deg),cos(deg),0,0);
• • • • • 裁剪 图像叠加 坐标变换 像素计算 动画
高级应用——裁剪
裁剪的步骤: 1. beginPath() 开始路径绘制 2. 通过arc, rect或者lineTo线段组合绘制要裁剪的路径区域 3. closePath() 闭合路径 4. clip() 设置裁剪 如何还原? 1. 在裁剪前使用save(),保存画布设置 2. 进行裁剪、绘图操作 3. 使用restore(),还原画布设置
Canvas 2D绘图
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用
• • • • • 裁剪 图像叠加 坐标变换 像素计算 动画
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用
• • • • • 裁剪 图像叠加 坐标变换 像素计算 动画
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用
• • • • 裁剪 图像叠加 坐标变换 动画
高级应用——图像叠加
图像叠加使用globalCompositeOperation参数来设置 source: 要绘制的图像
值 source-over source-in
putImageData(data, x, y, sx, sy, sw, sh)
将指定的像素数据放置到画板x,y 坐标上
context.puImageData(data, 100, 100, 0, 0, 100, 100);
读取到的像素数据为一个以下格式的对象: { width: 600, //图像宽度, height: 400, //图像高度, data: [] //像素数组 } 其中像素数组按照画板上从左到右,从上到下每个点的rgba值排列 *r1, g1, b1, a1, r2, g2, b2, a2, …+ 像素数据与画布无关,可以在不同的画布之间使用
准备工作
创建Canvas对象可以使用 var canvas = document.createElement(‘canvas’); 或者使用页面上已经存在的Canvas对象 var canvas = document.getElementById(‘canvas的id’); 设置Canvas的物理尺寸,可以通过 canvas.width = 400; canvas.height = 300; 或者HTML元素的设置方式 canvas.setAttribute(‘width’, 400); canvas.setAttribute(‘height’, 300); 最后,获取到Canvas的绘图接口 var context = canvas.getContext(‘2d’)
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用
• • • • • 裁剪 图像叠加 坐标变换 像素计算 动画
高级应用——动画
• 动画的本质就是绘制一副与当前状态相符的画面。 • 通常影响画面状态的是时间,但也包括其他参数。 一般用于制作时间动画的逻辑: 1. 动画开始时记录下开始时间。 2. 开始绘制时计算当前时间与开始时间的差。 3. 根据时间差,确定画面中每个元素的位置和状态,并绘制。 4. 在一定的延时之后从步骤2开始再次执行。
copy
清空整个画布,只画上source
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用
• • • • • 裁剪 图像叠加 坐标变换 像素计算 动画
高级应用——坐标变换
函数 translate(dx, dy) scale(sx, sy) rotate(deg) setTransform(m11, m12, m21,m22,dx,dy) 说明 坐标原点移动到dx,dy x轴缩放到sx,y轴缩放到sy 沿坐标原点旋转deg(弧度) 设置平面变换矩阵 示例 context.translate(100, 200); context.scale(1.5, 0.5); context.rotate(90 * Math.PI / 180); context.setTransform(1, 0, 0, 1, 0, 0);
以中心点旋转deg度(角度) translate(图像中心x, 图像中心y) 然后 rotate(deg * Math.PI / 180) 或者
setTransform(rotate(deg * Math.PI / 180), -sin(deg * Math.PI / 180),sin(deg * Math.PI / 180),cos(deg * Math.PI / 180), 图像中心x, 图像中心y);
高级应用——坐标变换
常用的坐标变换 width——图像宽度 height——图像高度 垂直翻转 translate(图像x, 图像y + height) 然后 scale(1, -1) 或者 setTransform(1, 0, 0, -1, 图像x, 图像y + height); 水平翻转 translate(图像x + width, 图像y) 然后 scale(-1, 1) 或者 setTransform(-1, 0, 0, 1, 图像x + width, 图像y)
绘制基本图形——绘制矩形
函数 fillRect(xect(x, y, width, height) 说明 绘制并填充矩形 绘制矩形并画出边框 示例 context.fillRect(0, 50, 100, 200); context.strokeRect(0, 50, 100, 200);
image: 要绘制的图像——图像元素<img>(必须已经加载完毕),也可以是另一个画布<canvas> sx, sy, sw, sh: 原始图像中要绘制的矩形区域x, y, 宽度, 高度 dx, dy, dw, dh: 画到画布上的矩形区域 x, y, 宽度, 高度
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用
绘制基本图形——绘制路径
函数 beginPath() closePath() 说明 开始路径绘制 结束路径绘制
arc(x, y, radius, starAngle,endAngle, anticlockwise) rect(x, y, width, height)
moveTo(x, y) lineTo(x, y) stroke() fill()
在两个图像交集以外的区域绘制source
在两个图像的交集中绘制source 在destination之下绘制source 保留两个图像交集中的destination内容,并清除交集以外区域 保留两个图像交集以外的destination,交集部分清除 在两个图像的交集中绘制source,但source画在destination之下 两个图像交集的部分,颜色值相加 两个图像交集的部分,颜色值相减 交集部分清空,非交集部分双方都保留
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用
• • • • • 裁剪 图像叠加 坐标变换 像素计算 动画
绘制基本图形——基本绘图设置
设置项 context.lineWidth context.fillStyle context.strokeStyle context.globalAlpha 说明 线条宽度 填充颜色 边框颜色 绘图透明度 示例 context.lineWidth = 2; context.fillStyle = ‘#000000’; context.strokeStyle = ‘#ff0000’; context.alpha = 0.7
绘制圆弧 绘制矩形
移动画笔 绘制线段到这个点 绘制路径的边框 填充路径内部区域
绘制基本图形——绘制圆弧
Canvas 2D绘图
• 准备工作 • 绘制基本图形 • 绘制文字 • 绘制图像 • 高级应用