Canvas 变换和离屏 Canvas 变换

Canvas 的坐标系以左上角原点,向右为 X 轴正方向,向下为 Y 轴正方向。有的时候,使用以左下角为原点,向上为 Y 轴正方向的坐标系会更方便,这时就需要使用 context.scale 和 context.translate 进行变换。

下文中的变量含义如下:

  • canvas:显示 Canvas
  • context:显示上下文
  • offscreenCanvas:离屏 Canvas
  • offscreenContext:离屏上下文

比如画一个坐标轴(红色代表 X 轴正方向,绿色代表 X 轴 负方向,蓝色代表 Y 轴正方向,黄色代表 Y 轴负方向):

运行:

js 复制代码
context.scale(1, -1);
context.translate(canvas.width / 2, -canvas.height / 2);

坐标轴发生偏移和翻转,原点位于 Canvas 中央:

需要注意的是:所有的变换是针对于图形自身的坐标系变换,因此变化方法(即translate和scale)的调用顺序会影响变换的结果。

有时为了优化性能,我们会用到OffscreenCanvas,现在离屏 Canvas 上进行绘画操作,再一次性将内容复制到显示 Canvas 上。那么对于离屏 Canvas,应该进行怎样的变换呢。

比如在执行:

js 复制代码
offscreenContext.fillRect(0, 0, 100, 100);
context.drawImage(offscreenCanvas, 0, 0, 400, 400); // 这里的位置和尺寸参数不需要进行变化,因为是直接读取视口的数据

结果是黑色方块出现在正确的象限中。此时离屏 Canvas 没有进行变换,但是因为drawImage会在获取离屏 Canvas 的数据后在显示 Canvas 上进行绘制时,也会对数据进行之前设定好的变换。

但是通常情况下,我们需要对离屏 Canvas 进行变换以方便我们的操作:

js 复制代码
offscreenContext.scale(1, -1);
offscreenContext.translate(canvas.width / 2, -canvas.height / 2);

结果却是黑色方块消失了。因为两个 Canvas 都应用了变换,对于图形来说相当于进行了 4 次变换,即翻转、平移、翻转、平移,实际位置在 Canvas 外的右上角,所以看不见了。此时只需要取消调显示 Canvas 的变换即可画出正确的图像。

相关推荐
paopaokaka_luck3 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787053 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
IMPYLH3 小时前
HTML 的 <video> 元素
前端·html
溪语流沙4 小时前
【每天一个CSS | Day19】流光文字与一笔写成的手写签名
前端·javascript·css
逐光者9334 小时前
STM32——SPI 屏 · Flash · 高速
java·前端·stm32
To_OC4 小时前
同样是让 AI 写全栈,为什么别人一句话就够了
前端·前端框架·next.js
CDwenhuohuo4 小时前
electron pc项目打包成桌面端
前端·javascript·electron
前端大斗师4 小时前
「大于 1000」把 1000 元那单也算进去了:我在 Vue3 订单页对了 10 句话
前端·人工智能·typescript·大模型·原力计划
Jmyd01235 小时前
用 Web VR 引擎搭建 3D 虚拟展厅:从素材上云到多端实时渲染的完整数据链路
前端·3d·vr·三维数字化
刘天远6 小时前
Agent成本核算实现:事件表、状态分布与Python归集
前端·数据库·人工智能·python