【HTML】Canvas(4)-进阶

canvas高级功能

         放大与缩小:用scale函数来实现图形的放大和缩小

         原型:scale(x,y);   x表示在x轴进行缩放,即水平缩放;y表示在y轴上进行缩放,即竖直方向缩放。

 

         放大:

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	//以(10,10)为坐标起点开始绘制一个长150,宽100的黑色矩形
	ctx.beginPath();
	ctx.strokeStyle='#000';
	ctx.strokeRect(10,10,150,100);

	//沿着x轴和y轴的方向将其值放大3倍,并用同样的代码重新绘制一个灰色的矩形
	ctx.scale(3,3);
	ctx.beginPath();
	ctx.strokeStyle='#ccc';
	ctx.strokeRect(10,10,150,100);

从运行效果看出,虽然用了同样的代码,但是第二次绘制的灰色矩形被放大了3倍,且起始坐标也一起被放大了3倍

 

         缩小:

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');
	
	//以(50,50)为坐标起点开始绘制一个长150,宽100的黑色矩形
	ctx.beginPath();
	ctx.strokeStyle='#000';
	ctx.strokeRect(50,50,150,100);

	//沿着x轴和y轴的方向将其值缩小0.5倍,并用同样的代码重新绘制一个灰色的矩形
	ctx.scale(0.5,0.5);
	ctx.beginPath();
	ctx.strokeStyle='#ccc';
	ctx.strokeRect(50,50,150,100);
从运行效果看出,虽然用了同样的代码,但是第二次绘制的灰色矩形被缩小了0.5倍,且起始坐标也一起被小了0.5倍。

使用scale函数时,若参数为负数,可以使图形翻转:

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	var image=new Image();
	image.src='../images/travel.jpg';
	image.onload=function(){
		ctx.drawImage(image,0,0);
		ctx.scale(1,-1);		//设置负数,使图片翻转
		ctx.drawImage(image,192,-168);
	};

平移:translate()函数

         原型:translate(x,y);    x表示在x轴进行平移,即水平方向上平移;y表示在y轴上进行平移,即竖直方向上平移

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	ctx.beginPath();
	ctx.strokeStyle='#000';
	ctx.strokeRect(10,10,150,100);

	ctx.translate(50,100);		//表示在水平方向右移50,垂直方向下移100
	ctx.beginPath();
	ctx.strokeStyle='#ccc';
	ctx.strokeRect(10,10,150,100);

旋转:rotate(angle);     angle是弧度而不是角度。如果角度为angle,那么换算为弧度就是angle*Math.PI/180

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');
	ctx.beginPath();
	ctx.strokeStyle='#000';
	ctx.strokeRect(200,50,100,50);

	ctx.rotate(45*Math.PI/180);
	ctx.strokeStyle='#f00';
	ctx.strokeRect(200,50,100,50);

如上图所示,rotate()实现旋转时,是以canvas的起始坐标(0,0)为中心进行旋转的,如果想要让图形以自己为中心旋转,则需要使用translate()函数:

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');
	ctx.beginPath();
	ctx.strokeStyle='#000';
	ctx.strokeRect(200,50,100,50);

	ctx.translate(250,75);
	ctx.rotate(45*Math.PI/180);
	ctx.translate(-250,-75);
	ctx.beginPath()
	ctx.strokeStyle='#f00';
	ctx.strokeRect(200,50,100,50);

先将canvas的起始坐标向右移250,向下移75,即移到所画矩形的中心处,然后开始旋转45度,接着再将canvas的起始坐标向左移250,向上移75度,即移回到原来位置,这样就完成了图形以自己为中心的旋转。


         图形的渲染:canvas提供了很多对颜色进行操作的API,可实现渐变、反色等效果。

         绘制颜色渐变效果的图形:颜色的渐变分为线性渐变和径向渐变

         线性渐变使用createLinearGradient函数和addColorStop函数实现

         createLinearGradient(x1,y1,x2,y2);       4个参数分别是渐变的出发点坐标(x1,y1)与终点坐标(x2,y2);

         addColorStop(position,color);      position参数必须是0.0到1.0之间的数值,表示渐变中颜色地点的相对地位,color参数表示渐变的颜色。

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	var grd=ctx.createLinearGradient(0,0,200,0);
	grd.addColorStop(0.2,'#0f0');
	grd.addColorStop(0.8,'#f00');
	ctx.fillStyle=grd;
	ctx.fillRect(0,0,200,100);

径向渐变:使用createRadialGradient函数和addColorStop函数实现

         createRadialGradient(x0,y0,r0,x1,y1,r1);      参数x0、y0为开始圆的圆心坐标,r0为开始圆的直径;x1、y1位结束圆的圆心坐标,r1为结束圆的直径。

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	var grd=ctx.createRadialGradient(100,100,10,100,100,50);
	grd.addColorStop(0,'#0f0');
	grd.addColorStop(1,'#f00');
	ctx.fillStyle=grd;
	ctx.fillRect(0,0,200,200);

颜色合成

         globalCompositeOperation属性说明绘制到画布上的颜色是如何与画布上已有颜色组合起来。下面列出其中可能要设置的值以及它们的含义,其中source一词指的是将要绘制到画布上的颜色,destination指画布上已经存在的颜色,默认值是source-over

         copy:只绘制新图形,删除其他所有内容

         darker:在图形重叠的地方,其颜色由两个颜色值相减后决定。

         destination-atop:画布上已有的内容只会在它和新图形重叠的地方保留。新图形绘制与内容之后。

         destination-in:在新图形及画布上已有图形重叠的地方,画布上已有内容都保留。所有其他内容均为透明的。

         destination-out:在画布上已有内容和新图形不重叠的地方,已有内容保留。其他内容均为透明的。

         destination-over:新图形绘制于画布上已有内容的后面。

         lighter:在图形重叠的地方,其颜色由两种颜色值的加值来决定。

         source-atop:只有在新图形和画布上已有内容重叠的地方才绘制新图形。

         source-in:在新图形以及画布上已有内容重叠的地方才绘制新图形,所有其他内容均为透明。

         source-out:只有在和画布上已有图形不重叠的地方才绘制新图形。

         source-over:新图形绘制与画布上已有图形的顶部。默认值。

         xor:在重叠和正常绘制的其他地方,图形都成为透明的。

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	ctx.fillStyle='#0f0';
	ctx.fillRect(10,10,50,50);
	ctx.globalCompositeOperation='xor';
	ctx.beginPath();
	ctx.fillStyle='#f00';
	ctx.arc(50,50,30,0,2*Math.PI);
	ctx.fill();

技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享

颜色反转(反相):就是对图形的每个像素进行颜色取反。

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	var image=new Image();
	image.src='../images/travel.jpg';
	image.onload=function(){
		ctx.drawImage(image,0,0);

		var imagedata=ctx.getImageData(0,0,250,250);
		var pixels=imagedata.data;
		//遍历每个像素并对RGB值进行取反
		for(var i=0,n=pixels.length;i<n;i+=4){
			pixels[i]=255-pixels[i];
			pixels[i+1]=255-pixels[i+1];
			pixels[i+2]=255-pixels[i+2];
		}
		//在指定位置进行像素重绘
		ctx.putImageData(imagedata,250,0);
	};
灰度控制:做法与反相相似,首先对图形的每个像素进行灰度计算

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	var image=new Image();
	image.src='../images/travel.jpg';
	image.onload=function(){
		ctx.drawImage(image,0,0);

		var imagedata=ctx.getImageData(0,0,250,250);
		var pixels=imagedata.data;
		//遍历每个像素并对RGB值进行取反
		for(var i=0,n=pixels.length;i<n;i+=4){
			var grayscale=pixels[i]*0.3+pixels[i+1]*0.59+pixels[i+2]*0.11;
			pixels[i]=grayscale;	//red
			pixels[i+1]=grayscale;	//green
			pixels[i+2]=grayscale;	//blue
		}
		//在指定位置进行像素重绘
		ctx.putImageData(imagedata,250,0);
	};
阴影效果:canvas API中包含了自动为图形添加下拉阴影的属性。阴影的颜色可用shadowColor属性来指定,并且可以通过shadowOffsetX和shadowOffsetY属性来改变。另外,应用到阴影边缘的羽化量也可以使用shadowBlur属性来设置。

技术分享

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	ctx.shadowColor='#f00';
	ctx.shadowBlur=10;		//羽化
	ctx.shadowOffsetX=20;
	ctx.shadowOffsetY=30;

	var image=new Image();
	image.src='../images/travel.jpg';
	image.onload=function(){
		ctx.drawImage(image,0,0);
	};

自定义画板

         主要思路和步骤如下:

         (1)当鼠标按下的时候,开始描画,此处需要加入鼠标按下事件。

         (2)当鼠标弹起的时候,结束描画,此处需要加入鼠标弹起事件。

         (3)在鼠标按下并且移动的时候,在鼠标经过的路径上画线,此处需要加入鼠标移动事件。

        

         canvas画布的导出功能:

         给画板添加图片导出功能,即复制canvas画板上的图像,使其显示为图片格式。使用canvas.toDataURL(‘image/png‘);

         如果想要将图片保存为图片文件,还需要借助PHP或ASP等工具。

         现在我们就在页面上新建一个<img>标签,然后将复制的canvas内容用<img>表示出来。

技术分享

HTML部分如下:

<canvas id="mycanvas" width="600" height="300">		
    	你的浏览器不支持HTML5
    </canvas>
    <br/>
    <button onclick='lineColor="yellow";'>Yellow</button>
    <button onclick='lineColor="red";'>Red</button>
    <button onclick='lineColor="blue";'>Blue</button>
    <button onclick='lineColor="green";'>Green</button>
    <button onclick='lineColor="white";'>White</button>
    <button onclick='lineColor="orange";'>orange</button>
    <br/>
    <br/>
    <button onclick="linew=4">4px</button>
    <button onclick="linew=8">8px</button>
    <button onclick="linew=16">16px</button>
    <button onclick="copyimage();">Export</button>
    <br/>
    <img src="" id="image_png" width="600" height="300"/>

Javascript部分:

var c=document.getElementById('mycanvas');
	var ctx=c.getContext('2d');

	//画一个黑色矩形
	ctx.fillStyle='black';
	ctx.fillRect(0,0,600,300);
	//按下标记
	var onoff=false;
	var oldx=-10;
	var oldy=-10;
	//设置颜色
	var lineColor='white';
	//设置线宽
	var linew=4;
	//添加鼠标移动事件
	c.addEventListener('mousemove',draw,true);
	//添加鼠标按下事件
	c.addEventListener('mousedown',down,false);
	//添加鼠标弹起事件
	c.addEventListener('mouseup',up,false);
	function down(event){
		onoff=true;
		oldx=event.pageX-10;
		oldy=event.pageY-10;
	}
	function up(){
		onoff=false;
	}
	function draw(event){
		if(onoff==true){
			var newx=event.pageX-10;
			var newy=event.pageY-10;
			ctx.beginPath();
			ctx.moveTo(oldx,oldy);
			ctx.lineTo(newx,newy);
			ctx.strokeStyle=lineColor;
			ctx.lineWidth=linew;
			ctx.lineCap='round';
			ctx.stroke();

			oldx=newx;
			oldy=newy;
		}
	}
	//导出图片
	function copyimage(event){
		var img_png_src=c.toDataURL('image/png');
		document.getElementById('image_png').src=img_png_src;
	}

Author:致知

Sign:路漫漫其修远兮,吾将上下而求索。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。