Skip to content

Commit 60f3003

Browse files
committed
Merge branch 'master' of github.com:wangdoc/webapi-tutorial
2 parents c399e76 + e0a929a commit 60f3003

File tree

1 file changed

+61
-15
lines changed

1 file changed

+61
-15
lines changed

docs/canvas.md

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,10 @@ ctx.canvas === canvas // true
615615
- `CanvasRenderingContext2D.rotate()`:图像旋转
616616
- `CanvasRenderingContext2D.scale()`:图像缩放
617617
- `CanvasRenderingContext2D.translate()`:图像平移
618+
- `CanvasRenderingContext2D.transform()`:通过一个变换矩阵完成图像变换
619+
- `CanvasRenderingContext2D.setTransform()`:取消前面的图像变换
620+
621+
**(1)rotate()**
618622

619623
`CanvasRenderingContext2D.rotate()`方法用于图像旋转。它接受一个弧度值作为参数,表示顺时针旋转的度数。
620624

@@ -630,6 +634,8 @@ ctx.fillRect(70, 0, 100, 30);
630634

631635
旋转中心点始终是画布左上角的原点。如果要更改中心点,需要使用`translate()`方法移动画布。
632636

637+
**(2)scale()**
638+
633639
`CanvasRenderingContext2D.scale()`方法用于缩放图像。它接受两个参数,分别是`x`轴方向的缩放因子和`y`轴方向的缩放因子。默认情况下,一个单位就是一个像素,缩放因子可以缩放单位,比如缩放因子`0.5`表示将大小缩小为原来的50%,缩放因子`10`表示放大十倍。
634640

635641
```javascript
@@ -655,34 +661,74 @@ ctx.fillText('Hello world!', 20, -20);
655661

656662
上面代码会显示一个水平倒转的、高度放大2倍的`Hello World!`
657663

664+
注意,负向缩放本质是坐标翻转,所针对的坐标轴就是画布左上角原点的坐标轴。
665+
666+
**(3)translate()**
667+
668+
`CanvasRenderingContext2D.translate()`方法用于平移图像。它接受两个参数,分别是 x 轴和 y 轴移动的距离(单位像素)。
658669

659670
```javascript
660-
ctx.translate( x, y )//位移:把图像原点位移到(x, y)的位置
661-
ctx.rotate( deg )//旋转:旋转 deg 度数
662-
ctx.scale( sx, sy )//缩放:在横向进行 sx 倍的缩放,在纵向进行 sy 倍的缩放
671+
var canvas = document.getElementById('myCanvas');
672+
var ctx = canvas.getContext('2d');
673+
674+
ctx.translate(50, 50);
675+
ctx.fillRect(0, 0, 100, 100);
663676
```
664677

665-
缩放出现的问题
666-
1.如果有`lineWith`,宽度也会缩放
667-
2.如果起始点不是`(0, 0)`,起始点也会缩放
678+
**(4)transform()**
679+
680+
`CanvasRenderingContext2D.transform()`方法接受一个变换矩阵的六个元素作为参数,完成缩放、旋转、移动和倾斜等变形。
668681

669-
### 变换矩阵
682+
它的使用格式如下。
670683

671684
```javascript
672685
ctx.transform(a, b, c, d, e, f);
673686
/*
674-
a:水平缩放(默认值1)
675-
b:水平倾斜(默认值0)
676-
c:垂直倾斜(默认值0)
677-
d:垂直缩放(默认值1)
678-
e:水平位移(默认值0)
679-
f:垂直位移(默认值0)
687+
a:水平缩放(默认值1,单位倍数)
688+
b:水平倾斜(默认值0,单位弧度)
689+
c:垂直倾斜(默认值0,单位弧度)
690+
d:垂直缩放(默认值1,单位倍数)
691+
e:水平位移(默认值0,单位像素)
692+
f:垂直位移(默认值0,单位像素)
680693
*/
681694
```
682695

683-
`context.transform()`可以叠加使用,如果需要重新初始化矩阵变换的值,可以用`context.setTransform(a, b, c, d, e, f)`。它会使得之前设置的`context.transform()`失效,恢复为单位矩阵然后再`transform`
696+
下面是一个例子。
697+
698+
```javascript
699+
var canvas = document.getElementById('myCanvas');
700+
var ctx = canvas.getContext('2d');
701+
702+
ctx.transform(2, 0, 0, 1, 50, 50);
703+
ctx.fillRect(0, 0, 100, 100);
704+
```
705+
706+
上面代码中,原始图形是 100 x 100 的矩形,结果缩放成 200 x 100 的矩形,并且左上角从`(0, 0)`移动到`(50, 50)`
707+
708+
注意,多个`transform()`方法具有叠加效果。
709+
710+
**(5)setTransform()**
711+
712+
`CanvasRenderingContext2D.setTransform()`方法取消前面的图形变换,将画布恢复到该方法指定的状态。该方法的参数与`transform()`方法完全一致。
713+
714+
```javascript
715+
var canvas = document.getElementById('myCanvas');
716+
var ctx = canvas.getContext('2d');
717+
718+
ctx.translate(50, 50);
719+
ctx.fillRect(0, 0, 100, 100);
720+
721+
ctx.setTransform(1, 0, 0, 1, 0, 0);
722+
ctx.fillRect(0, 0, 100, 100);
723+
```
724+
725+
上面代码中,第一个`fillRect()`方法绘制的矩形,左上角从`(0, 0)`平移到`(50, 50)``setTransform()`方法取消了这个变换(已绘制的图形不受影响),将画布恢复到默认状态(变换矩形`1, 0, 0, 1, 0, 0`),所以第二个矩形的左上角回到`(0, 0)`
726+
727+
## `<canvas>` 元素的方法
728+
729+
除了`CanvasRenderingContext2D`对象提供的方法,`<canvas>`元素本身也有自己的方法。
684730

685-
## HTMLCanvasElement.toDataURL(),HTMLCanvasElement.toBlob()
731+
### HTMLCanvasElement.toDataURL(),HTMLCanvasElement.toBlob()
686732

687733
`<canvas>`元素的`toDataURL()`方法,可以将 Canvas 数据转为 Data URI 格式的图像。
688734

0 commit comments

Comments
 (0)