HTML5之画布(canvas)(二)

来源:互联网 发布:自学素描的软件 编辑:程序博客网 时间:2024/06/13 10:24

上一篇我们简单介绍了一下画布的概念,那么这一篇文章来写一下canvas的绘图方法图像变换

绘图方法
canvas画布提供了一个用来作图的平面空间,该空间的每个点都有自己的坐标,x表示横坐标,y表示竖坐标。原点(0, 0)位于图像左上角,x轴的正向是原点向右,y轴的正向是原点向下。

(1)绘制路径
beginPath方法用于表示开始绘制路径,moveTo(x, y)方法设置线段的起点,lineTo(x, y)方法设置线段的终点,stroke方法用来给透明的线段着色。例如:

c.beginPath(); // 开始路径绘制c.moveTo(20, 20); // 设置路径起点,坐标为(20,20)c.lineTo(200, 20); // 绘制一条到(200,20)的直线c.lineWidth = 1.0; // 设置线宽c.lineCap = "butt"; //设置端点样式:butt(默认),round,squarec.lineJoin = "miter"; //设置连接样式:miter(默认),bevel,roundc.strokeStyle = '#CC0000'; // 设置线的颜色c.stroke(); // 进行线的着色,这时整条线才变得可见

moveto()方法和lineto()方法可以多次使用。同事,也可以使用closePath()方法,自动绘制一条当前点到起点的直线,形成一个封闭的图形,节省一次lineto()方法。

(2)绘制矩形

这部分在上一篇文章也简单提到了一下,这里再来说一下,fillRect(x, y, width, height)方法用来绘制矩形,它的四个参数分别代表矩形左上角顶点的x坐标、y坐标,以及矩形的宽和高。fillStyle属性用来设置矩形的填充色。如下:

c.fillStyle = 'yellow';x.fillRect(50, 50, 200, 100); 

strokeRect方法与fillRect类似,用来绘制空心矩形。

c.strokeRect(10,10,200,100);

clearRect方法用来清除某个矩形区域的内容。

c.clearRect(100,50,50,50); 

(3)绘制文本
fillText(string, x, y) 用来绘制文本,它的三个参数分别为文本内容、起点的x坐标、y坐标。使用之前,需用font设置字体、大小、样式(写法类似与CSS的font属性)。与此类似的还有strokeText方法,用来添加空心字。

// 设置字体c.font = "Bold 20px Arial"; // 设置对齐方式c.textAlign = "left";// 设置填充颜色c.fillStyle = "#008600"; // 设置字体内容,以及在画布上的位置c.fillText("Hello!", 10, 50); // 绘制空心字c.strokeText("Hello!", 10, 100); 

fillText方法不支持文本断行,即所有文本出现在一行内。所以,如果要生成多行文本,只有调用多次fillText方法。

(4)绘制圆形和扇形
arc方法用来绘制扇形。

c.arc(x, y, radius, startAngle, endAngle, anticlockwise);

arc方法的x和y参数是圆心坐标,radius是半径,startAngle和endAngle则是扇形的起始角度和终止角度(以弧度表示),anticlockwise表示做图时应该逆时针画(true)还是顺时针画(false)。

下面是绘制一个实心的圆形

c.beginPath(); c.arc(60, 60, 50, 0, Math.PI*2, true); c.fillStyle = "#000000"; c.fill();

下面是绘制一个空心的圆形

c.beginPath(); c.arc(60, 60, 50, 0, Math.PI*2, true); c.lineWidth = 1.0; c.strokeStyle = "#000"; c.stroke();

(5)设置渐变色
createLinearGradient方法用来设置渐变色。

var myGradient = ctx.createLinearGradient(0, 0, 0, 160); myGradient.addColorStop(0, "#BABABA"); myGradient.addColorStop(1, "#636363");

createLinearGradient方法的参数是(x1, y1, x2, y2),其中x1和y1是起点坐标,x2和y2是终点坐标。通过不同的坐标值,可以生成从上至下、从左到右的渐变等效果。使用方法如下:

c.fillStyle = myGradient;c.fillRect(10,10,200,100);

(6)设置阴影

c.shadowOffsetX = 10; // 设置水平位移c.shadowOffsetY = 10; // 设置垂直位移c.shadowBlur = 5; // 设置模糊度c.shadowColor = "rgba(0,0,0,0.5)"; // 设置阴影颜色c.fillStyle = "#CC0000"; c.fillRect(10,10,200,100);


图像变换

(1)平移、旋转、缩放

c.translate( x, y )//位移:把图像原点位移到(x, y)的位置c.rotate( deg )//旋转:旋转 deg 度数c.scale( sx, sy )//缩放:在横向进行 sx 倍的缩放,在纵向进行 sy 倍的缩放

缩放出现的问题 1.如果有lineWith,宽度也会缩放 2.如果起始点不是0 0,起始点也会缩放

(2)变换矩阵

c.transform(a, b, c, d, e, f);/*a:水平缩放(默认值1)b:水平倾斜(默认值0)c:垂直倾斜(默认值0)d:垂直缩放(默认值1)e:水平位移(默认值0)f:垂直位移(默认值0)*/

context.transform()可以叠加使用,如果需要重新初始化矩阵变换的值,可以用: context.setTransform(a, b, c, d, e, f) 它会使得之前设置的context.transform()失效,恢复为单位矩阵然后再transform。


注:本文借鉴Canvas API