Canvas变形

Canvas变形


变形是一种更强大的方法,可以将原点移动到另一点,还能对网格进行旋转和缩放

保存状态

在变形之前需要对状态进行保存 否则无法恢复

状态的保存save()和恢复restore() 方法是用来保存和恢复 canvas 状态的,方法不需要参数。

可以理解为就是对canvas 状态的快照进行保存和恢复

Canvas的状态是存储在栈中的,每次调用save()方法后,当前的状态都会被推送到栈中保存起来。

一个绘画状态包括:

应用的变形:移动、旋转、缩放、strokeStyle、fillStyle、globalAlpha、lineWidth、lineCap、lineJoin、miterLimit、lineDashOffset、shadowOffsetX、shadowOffsetY、shadowBlur、shadowColor、globalCompositeOperation、font、textAlign、textBaseline、direction、imageSmoothingEnabled等。

应用的裁切路径:clipping path

	ctx.fillStyle = 'skyblue'
    ctx.fillRect(10, 10, 300, 100);
    ctx.save(); // 保存状态
    ctx.fillStyle = "#ee7034";
    ctx.fillRect(10, 150, 300, 100);
    ctx.restore(); // 还原到上次保存的状态
    ctx.fillRect(10, 300, 300, 100);

:保存和恢复可以多次调用, 需要注意的是每一次调用 restore 方法,上一个保存的状态就从栈中弹出,所有设定都恢复。


移动、旋转和缩放

translate(x, y)
移动,x 是左右偏移量,y 是上下偏移量。

rotate(angle)
旋转,angle是旋转的角度,它是顺时针旋转,以弧度为单位的值。

scale(x, y)
缩放,x 为水平缩放的值,y 为垂直缩放得值。x和y的值小于1则为缩小,大于1则为放大。默认值为 1。

		ctx.fillStyle = 'skyblue'
        ctx.save(); // 保存状态
        ctx.save(); // 保存状态
        // ctx.fillRect(10, 10, 300, 100);
        ctx.fillStyle = "#ee7034";
        ctx.translate(200, 300)
        ctx.fillRect(10, 150, 300, 100);
        ctx.restore(); // 还原到上次保存的状态
        ctx.rotate(Math.PI / 4)
        ctx.fillRect(10, 10, 300, 100);
        ctx.restore(); // 还原到上次保存的状态
        ctx.scale(1.1, 1.1)
        ctx.fillRect(10, 20, 300, 100);
        // save()保存的状态是可以多次保存的,同时保存在栈中的元素遵循的是后进先出的顺序;
        // 旋转的中心点始终是 canvas 的原点;缩放如果是负值的话,则是一个镜像的效果



transform、setTransform、resetTransform

transform(a, b, c, d, e, f)
能将当前的变形矩阵乘上一个基于自身参数的矩阵

矩阵的计算转换为方程式是:

      a, c, e
    [ b, d, f ]
      0, 0, 1

转换后的坐标的x为:x` = ax+cy+e;

转换后的坐标的y为:y` =bx+cy+f;


setTransform(a, b, c, d, e, f)
将当前变形矩阵重置为单位矩阵,然后用相同的参数调用 transform 方法


resetTransform()
重置当前变形为单位矩阵。效果等同于调用 setTransform(1, 0, 0, 1, 0, 0)

需要注意的是transform方法和setTransform方法中如果任意一个参数是无限大(Infinity),那么变形矩阵也必须被标记为无限大,否则会抛出异常。

参数说明:

a:水平方向的缩放
b:竖直方向的倾斜偏移
c:水平方向的倾斜偏移
d:竖直方向的缩放
e:水平方向的移动
f:竖直方向的移动

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raccom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值