HTML5读书笔记之四:Canvas高级功能

<!DOCTYPE html>
<html>
<head>
	<title>CanvasTest2</title>
	<meta charset="utf-8">
	<link href="./css/canvas.css" rel="stylesheet" type="text/css">
	<script type="text/javascript" src="./jquery/jquery-1.11.1.min.js">
	</script>

	<script type="text/javascript">
		$(document).ready(function(){
		var canvas = $("#myCanvas");
		var context = canvas.get(0).getContext("2d");
		/************************************保存和恢复绘图状态**************************************************************************************		

		context.fillStyle = "rgb(255, 0, 0)";	//绘制风格
		context.save();							//保存画布状态
		context.fillRect(50, 50, 100, 100);

		context.fillStyle = "rgb(0, 0, 255)";
		context.save();
		context.fillRect(200, 50, 100, 100);

		context.restore();						//恢复画布状态
		context.fillRect(350, 50, 100, 100);

		context.restore();
		context.fillRect(50, 200, 100, 100);

		***************************************变形--平移********************************************************************************************

		context.fillRect(50, 50, 100, 100);
		context.translate(150, 150);			//将原点从一个位置移到另一个位置

		context.fillStyle="rgb(255, 0, 0)";
		context.fillRect(50, 50, 100, 100);

		***************************************变形--缩放********************************************************************************************

		context.save();							//保存画布状态
		context.translate(150, 150);
		context.scale(2, 2);					//进行缩放部分
		context.fillRect(0, 0, 100, 100);

		context.restore();						//恢复画布状态
		context.fillRect(0, 0, 100, 100);		//不进行缩放部分

		***************************************变形--旋转********************************************************************************************

		context.translate(200, 200);	//将要旋转的正方形的圆心平移
		context.rotate(0.7854);			//旋转45度角
		context.fillRect(-50, -50, 100, 100);		//绘制正方形

		***************************************变形--变换矩阵****************************************************************************************

		context.setTransform(1, 0, 0, 1, 0, 0);		//单位矩阵
		var xScale = Math.cos(0.7854);				//x轴缩放
		var ySkew = -Math.sin(0.7854);				//y轴倾斜
		var xSkew = Math.sin(0.7854);				//x轴倾斜
		var yScale = Math.cos(0.7854);				//y轴缩放
		var xTrans = 200;							//x轴平移
		var yTrans = 200;							//y轴平移

		context.transform(xScale, ySkew, xSkew, yScale, xTrans, yTrans);
		context.fillRect(-50, -50, 100, 100);

		***************************************合成--全局阿尔法值************************************************************************************

		context.fillStyle = "rgb(63, 169, 245)";
		context.fillRect(50, 50, 100, 100);
		context.globalAlpha = 0.5;					//0.5是与globalAlpha匹配的全局阿尔法值,再次使用fillStyle时(带有一个0.5的全局阿尔法值)会使全局阿尔法值
		context.fillStyle = "rgb(255, 123, 172)";	//,0.5*0.5=0.25
		context.fillRect(100, 100, 100, 100);

		context.globalAlpha = 0.25;
		context.fillStyle = "rgb(255, 123, 172)";
		context.fillRect(150, 150, 100, 100);

		***************************************合成--合成操作*****************************************************************************************

		context.fillStyle = "rgb(63, 169, 245)";
		context.fillRect(50, 50, 100, 100);
		context.globalCompositeOperation = "source-over";	//默认值,表示绘制的图形(源)将画在现有的画布(目标)之上
		context.fillStyle = "rgb(255, 123, 172)";
		context.fillRect(100 ,100, 100, 100);
		/*
		globalCompositeOperation支持11种属性:1.source-over	默认值,表示绘制的图形(源)将画在现有的画布(目标)之上
											  2.destination-over 与source-over相反,将目标绘制在源之上
											  3.source-atop ..不一一解释了,上网搜索,看合成效果会有更直观的印象
											  4.destination-atop 5.source-in 6.destination-in 7.source-out 8.destination-out
											  9.lighter 10.copy 11.xor
		*/

		/***************************************合成--阴影********************************************************************************************

		//阴影效果可通过4个属性值来进行操作,shadowBlur(像素模糊值,默认0),shadowOffsetX(默认0),shadowOffsetY(默认0),shadowColor(默认设置为透明黑)
		/*例1
		context.shadowBlur = 20;
		context.shadowColor = "rgb(0, 0, 0)";
		context.fillRect(50, 50, 100, 100);
		*/

		/*例2
		context.shadowBlur = 0;
		context.shadowOffsetX = 10;
		context.shadowOffsetY = 10;
		context.shadowColor = "rgba(100, 100, 100, 0.5)";	//透明灰
		context.fillRect(200, 50, 100, 100);
		*/

		/*例3
		context.shadowColor = "rgb(255, 255, 0)";				//金黄
		context.shadowBlur = 20;
		context.shadowOffsetX = 0;
		context.shadowOffsetY = 0;
		context.beginPath();
		context.arc(400, 100, 50, 0, Math.PI*2, false);
		context.fill();
		*/

		/***************************************合成--渐变********************************************************************************************
		//线性渐变createLinearGradient,放射性渐变createRadialGradient
		/*例1
		var gradient = context.createLinearGradient(0, 0, 0, canvas.height());
		gradient.addColorStop(0, "rgb(0, 0, 0)");
		gradient.addColorStop(1, "rgb(255, 255, 255)");

		context.fillStyle = gradient;
		context.fillRect(0, 0, canvas.width(), canvas.height());
		*/

		/*例2
		createRadialGradient(x0, y0, r0, x1, y1, r1)		两个圆之间存在渐变的关系
		var gradient = context.createRadialGradient(300, 300, 10, 100, 100, 50);
		gradient.addColorStop(0, "rgb(0, 0, 0)");
		gradient.addColorStop(1, "rgb(150, 150, 150)");

		context.fillStyle = gradient;
		context.fillRect(0, 0, canvas.width(), canvas.height());
		*/

		/*例3
		var canvasCentreX = canvas.width()/2;
		var canvasCentreY = canvas.width()/2;
		var gradient = context.createRadialGradient(canvasCentreX, canvasCentreY, 0, canvasCentreX, canvasCentreY, 250);
		gradient.addColorStop(0, "rgb(0, 0, 0)");
		gradient.addColorStop(1, "rgb(150, 150, 150)");

		context.fillStyle = gradient;
		context.fillRect(0, 0, canvas.width(), canvas.height());
		*/
		/***************************************合成--复杂路径*****************************************************************************************
		/*例1
		//创建一个三角形
		context.beginPath();
		context.moveTo(100, 50);		//将原点移动到指定点,创建一个全新的子路径
		context.lineTo(150, 150);
		context.lineTo(50, 150);
		context.closePath();
		context.stroke();
		context.fill();
		*/

		/*例2
		//二次贝塞尔曲线
		context.lineWidth = 5;
		context.beginPath();
		context.moveTo(50, 250);
		context.quadraticCurveTo(250, 100, 450, 250);
		context.stroke();
		*/
		/*例3
		//三次贝塞尔曲线
		context.lineWidth = 5;
		context.beginPath();
		context.moveTo(50, 250);
		context.bezierCurveTo(150, 50, 350, 450, 450, 250);	//参数含义自行百度吧
		context.stroke();
		*/

		/***************************************将画布导出为图像*****************************************************************************************/
		context.save();
		context.fillRect(50, 50, 100, 100);

		context.fillStyle = "rgb(255, 0, 0)";
		context.fillRect(100, 100, 100, 100);

		context.restore();
		context.fillRect(150, 150, 100, 100);

		var dataURL = canvas.get(0).toDataURL();

		var url = $("#url");

		url.html(dataURL);

		var img = $("<img></img>");
		img.attr("src", dataURL);

		canvas.replaceWith(img);

		});
	</script>

</head>

<body>
<canvas id="myCanvas" width="1000" height="1000">

</canvas>
<p id="url"></p>
</body>
</html>

时间: 2024-10-21 23:23:40

HTML5读书笔记之四:Canvas高级功能的相关文章

【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句&amp;倒装句(Reduced Clauses、Inverted Sentences) 【完结】

[英语魔法俱乐部——读书笔记] 3 高级句型-简化从句&倒装句(Reduced Clauses.Inverted Sentences):(3.1)从属从句简化的通则.(3.2)形容词从句简化.(3.3)名词从句简化.(3.4)副词从句简化.(3.5)简化从句练习.(3.6)倒装句 3.1 从属从句简化的通则(Generally Reduction Rules of Dependent Clause) 3.1.1 简化从句:英语语法以句子为研究对象,而其句型也分为简单句.复句和合句之分,其中简单句

《Effective C++》 读书笔记之四 设计与申明

<Effective C++> 读书笔记之四 设计与申明 条款18:让接口容易被正确使用,不易被误用. 重点: 好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. "促进正确使用"的办法包括接口的一致性,以及与内置类型的行为兼容. "阻止误用"的办法包括建立新类型.限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. tr1::shared_ptr支持定制型删除器.这可防范DLL问题,可被用来自动解除互斥锁等等. 20

《C#图解教程》读书笔记之四:类和继承

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.万物之宗:Object (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义. (2)一个派生类只能有一个基类,叫做单继承. 二.基类那点事儿 (1)如何在派生类中访问基类成员?使用base关键字,如base.Field1: (2)如何屏蔽基类中某个方法或成员?在派生类定义的成员定义前使用new关键字: (3)如何使用基类的引用?这里可以借鉴里氏替换法则,创建指向派生类的基类对象. 三.小

HTML5读书笔记——canvas元素

html5相对于html,增加了一些新的元素,比如canvas,audio,image等. canvas元素为脚本提供了像素级的画布,可以试试渲染图形.游戏画面或其他虚拟图像.canvas元素可绘制直线.圆.矩阵等基本形状,以及图像和基本文字.目前,各大浏览器都已开始支持GPU加速的2D canvas渲染,因此使用canvas辉指出的游戏动画运行速度会很快. 首先,在<body>中加入<canvas>标签,如下: 其中,body中的onload事件调用函数,可以确保函数运行前,页面

HTML5读书笔记之三:Canvas基础知识

<!doctype html> <head> <title>Canvas Test</title> <meta charset="UTF-8"> <link href="./css/canvas.css" rel="stylesheet" type="text/css"> <script type="text/javascript"

canvas 高级功能整理

第一部分.保存和恢复绘图状态 画布中,绘图状态指的是描述某一时刻2D渲染上下文外观的整套属性,从简单的颜色值到复杂变换矩阵及其它特性 注意:画布上的当前路径和当前位图(正在显示的内容)不属于状态 1.保存绘图状态:save(); 2.恢复绘图状态:restore(); <script type="text/javascript"> function draw1(id){ var canvas = document.getElementById(id); var contex

html5学习笔记:canvas

1.什么是canvas? 可以绘制图形的标签.一般用javascript来绘制. 2.创建一个画布 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 </head> 6 <body> 7 <canvas id="mycanvas" width="100" height="100"></

【读书笔记】C#高级编程 第十章 集合

(一)概述 数组的大小是固定的.如果元素个数是动态的,就应使用集合类. List<T>是与数组相当的集合类.还有其它类型的集合:队列.栈.链表.字典和集. (二)列表 1.创建列表 调用默认的构造函数,就可以创建列表对象.在泛型类List<T>中,必须为声明为列表的值指定类型.使用默认构造函数创建一个空列表.元素添加到列表后,列表的容量会扩大,每次添加元素达到容量上限后,容量将重新设置为原来的2倍. 例子: List<string> strList = new List

【读书笔记】C#高级编程 第十二章 动态语言扩展

(一)DLR C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务. (二)dynamic类型 dynamic类型允许编写忽略编译期间的类型检查的代码.编译器假定,给dynamic类型的对象定义的任何操作都是有效的,在运行之前编译器不会检测是否存在错误. 例子: dynamic person = "人"; string firstName = person.FirstName; 这两行代码能够通过编译器编