Canvas的globalCompositeOperation属性详解和小练习&&实现放大镜

Posted 孤寒者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Canvas的globalCompositeOperation属性详解和小练习&&实现放大镜相关的知识,希望对你有一定的参考价值。

目录:

每篇前言~


canvas图像融合操作

1.globalCompositeOperation属性

此属性作用:设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>图像融合</title>
		<style type="text/css">
			#c
				border: 1px solid blue;
			
		</style>
	</head>
	<body>
		
		<canvas id="c" width="1500" height="700"></canvas>
		
	</body>
	
	<script type="text/javascript">
		var c = document.getElementById("c");
		var ctx = c.getContext("2d");
		
		// 实心矩形
		ctx.fillStyle = "red";
		ctx.fillRect(100,100,400,400);
		
		// ------------------------------------------------------------------------------------------
		// globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上。	 |
		// 目标图像:已经存在于画布的内容;																 |
		// 源图像:当前要画到画布上的内容。															 |
		// ------------------------------------------------------------------------------------------
		// source-over:默认。目标图像和源图像都显示,源图像会显示在目标图像上;					     	 |
		// source-in:只会显示源图像,而且只显示和目标图像重叠的部分,目标图像是透明的;				     |
		// source-atop:目标图像和源图像都会显示,但是源图像在上面,而且只显示重叠的源图像;			     |
		// source-out:只会显示源图像,而且只显示和目标图像不重叠的部分;								     |
		//-------------------------------------------------------------------------------------------
		// destination-over:目标图像和源图像都显示,目标图像会显示在源图像上;						     |
		// destination-in:只会显示目标图像,而且只显示和源图像重叠的部分,源图像是透明的;		 	     |
		// destination-atop:目标图像和源图像都会显示,但是目标图像在上面,而且只显示重叠的目标图像;	     |
		// destination-out:只会显示目标图像,而且只显示和源图像不重叠的部分;						     |
		// ------------------------------------------------------------------------------------------
		// 拓展:																					 |
		// xor:目标图像和源图像都显示,但是二者重叠部分均不显示;										 |
		// copy:只显示源图像,不显示目标图像;    														 |
		// lighter:目标图像和源图像都显示,重叠部分颜色融合;											 |
		ctx.globalCompositeOperation = "source-out";
		
		// 实心圆
		ctx.beginPath();
		ctx.fillStyle = "blue";
		ctx.arc(500,500,100,0,Math.PI*2,false);
		ctx.fill();
			
		
	</script>
	
</html>

2.实践:

①将canvas画布填充为灰色

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>图像融合2</title>
		<style type="text/css">
			#c1
				border: 1px solid black;
			
		</style>
	</head>
	<body>
		<canvas id="c1" width="1200" height="700"></canvas>
	</body>
	
	<script type="text/javascript">
		var c = document.getElementById("c1");
		var ctx = c.getContext("2d");
		
		// 实心矩形填满画布
		ctx.fillStyle = "gray";
		ctx.fillRect(0,0,c.width,c.height);
	</script>
</html>

②在灰色画布上绘制一个实心圆

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>图像融合2</title>
		<style type="text/css">
			#c1
				border: 1px solid black;
			
		</style>
	</head>
	<body>
		<canvas id="c1" width="1200" height="700"></canvas>
	</body>
	
	<script type="text/javascript">
		var c = document.getElementById("c1");
		var ctx = c.getContext("2d");
		
		// 实心矩形填满画布
		ctx.fillStyle = "gray";
		ctx.fillRect(0,0,c.width,c.height);
		
		// 绘制一个实心圆
		ctx.beginPath();
		ctx.arc(400,400,150,0,Math.PI*2,false);
		ctx.fillStyle = "red";
		ctx.fill();
	</script>
</html>

③实现实心圆部分挖空

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>图像融合2</title>
		<style type="text/css">
			#c1
				border: 1px solid black;
			
		</style>
	</head>
	<body>
		<canvas id="c1" width="1200" height="700"></canvas>
	</body>
	
	<script type="text/javascript">
		var c = document.getElementById("c1");
		var ctx = c.getContext("2d");
		
		// 实心矩形填满画布
		ctx.fillStyle = "gray";
		ctx.fillRect(0,0,c.width,c.height);
		
		// 目标图像和源图像重叠部分不显示
		ctx.globalCompositeOperation = "destination-out";
		
		// 绘制一个实心圆
		ctx.beginPath();
		ctx.arc(400,400,150,0,Math.PI*2,false);
		ctx.fillStyle = "red";
		ctx.fill();
	</script>
</html>

④绘制圆的外接正方形并让此外接正方形显示在上层

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>图像融合2</title>
		<style type="text/css">
			#c1
				border: 1px solid black;
			
		</style>
	</head>
	<body>
		<canvas id="c1" width="1200" height="700"></canvas>
	</body>
	
	<script type="text/javascript">
		var c = document.getElementById("c1");
		var ctx = c.getContext("2d");
		
		// 实心矩形填满画布
		ctx.fillStyle = "gray";
		ctx.fillRect(0,0,c.width,c.height);
		
		// 目标图像和源图像重叠部分不显示
		ctx.globalCompositeOperation = "destination-out";
		
		// 绘制一个实心圆
		ctx.beginPath();
		ctx.arc(400,400,150,0,Math.PI*2,false);
		ctx.fillStyle = "red";
		ctx.fill();
		
		// destination-over:目标图像和源图像都显示,目标图像会显示在源图像上;
		ctx.globalCompositeOperation = "destination-over";
		
		ctx.beginPath();
		ctx.fillStyle = "blue"
		ctx.fillRect(250,250,300,300);
		
	</script>
</html>

3.实现放大镜

  • 在图片上任意位置点击随意移动,松开鼠标取消
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>画图像</title>
		<style type="text/css">
			#c
				border: 1px solid black;
			
		</style>
	</head>
	<body>
		
		<canvas id="c" width="538" height="940.5"></canvas>
		
	</body>
	<script type="text/javascript">
		var c = document.getElementById("c");
		var jb = c.getContext("2d");
		
		// 创建一个图片对象
		var img = new Image();
		// 指定图片地址    此处使用相对定位!
		img.src = 'img/1.jpeg';
		
		// 注意:图片不能直接放canvas上,需要通过事件.onload加载,不然图片可能因为没有加载完成而未出现在画布
		img.onload = function()
			jb.drawImage(this,0,0,538,940.5)
		
		
	
		// 监听canvas的onmousedown事件
		c.onmousedown = function(ev)
		c.onmousemove = function(e)
			// 先清空画布
			jb.clearRect(0,0,538,940.5);
			// 再绘制图像
			jb.drawImage(img,0,0,538,940.5);
			
			// 获取鼠标位置相对于画布左上角的坐标
			var x = e.pageX-c.offsetLeft;
			var y = e.pageY-c.offsetTop;
			var r = 100;
			
			// 配合下面放大用的圆实现镂空
			jb.globalCompositeOperation ="destination-out";
			
			// 实现点击生成放大用的圆
			jb.beginPath();
			jb.arc(x,y,r,0,Math.PI*2,false);
			jb.fill();
			
			jb.globalCompositeOperation = "destination-over";
			
			var x1 = x * 2 - r;
			var y1 = y * 2 - r;
			var w1 = 2 * r;
			var h1 = 2 * r;
			
			var x2 = x - r;
			var y2 = y - r;
			var w2 = 2 * r;
			var h2 = 2 * r;
			
			// 在圆里绘制放大的部分图片
			jb.drawImage(img,x1,y1,w1,h1,x2,y2,w2,h2);

		
		
		c.onmouseup = function(ev)
			// 取消onmousemove事件
			c.onmousemove = null;
		
			// 先清空画布
			jb.clearRect(0,0,538,940.5);
			// 再绘制图像
			jb.drawImage(img,0,0,538,940.5);
		
		
	</script>
</html>


以上是关于Canvas的globalCompositeOperation属性详解和小练习&&实现放大镜的主要内容,如果未能解决你的问题,请参考以下文章

canvas圆点动效图

canvas-圆的绘制

canvas文字丢失

HTML5 - Canvas

如何使用canvas绘制走势图

前端笔记 — canvas