Canvas画布撤销与前进实现方案

简介: Canvas画布撤销与前进实现方案

 

实现原理:

    1. 保存快照:每完成一次绘制操作则保存一份 canvas 快照到 canvasHistory 数组(生成快照使用 canvas 的 toDataURL() 方法,生成的是 base64 的图片);
    2. 撤销和反撤销:把 canvasHistory 数组中对应索引的快照使用 canvas 的 drawImage() 方法重绘一遍;
    3. 绘制新图像:执行新的绘制操作时,删除当前位置之后的数组记录,然后添加新的快照。
    // 变量定义
    let myCanvas = document.querySelector('#myCanvas');
    let ctx = myCanvas.getContext('2d');
    let canvasWidth = 200;
    let canvasHeight = 200;
    let canvasHistory = [];
    let step = -1;
    // 绘制方法
    canvasDraw() {
      step++;
        if (step < canvasHistory.length) {
          canvasHistory.length = step; // 截断数组
        }
        // 执行绘制的相关操作(如绘制图片、线条等)
        // ...
        // ...
        canvasHistory.push(myCanvas.toDataURL()); // 添加新的绘制到历史记录
    }
    // 撤销方法
    canvasUndo() {
      if (step >= 0) {
        step--;
        ctx.clearRect(0, 0, canvasWidth, canvasHeight);
        let canvasPic = new Image();
        canvasPic.src = canvasHistory[step];
        canvasPic.addEventListener('load', () => {
          ctx.drawImage(canvasPic, 0, 0);
        });
      } else {
        console.log('不能再继续撤销了');
      }
    }
    // 反撤销方法
    canvasRedo() {
      if (step < canvasHistory.length - 1) {
        step++;
        let canvasPic = new Image();
        canvasPic.src = canvasHistory[step];
        canvasPic.addEventListener('load', () => {
          ctx.clearRect(0, 0, canvasWidth, canvasHeight);
          ctx.drawImage(canvasPic, 0, 0);
        });
      } else {
        console.log('已经是最新的记录了');
      }
    }

    image.gif

    目录
    相关文章
    |
    Web App开发 编解码 前端开发
    webgl canvas系列——快速加背景、抠图、加水印并下载图片
    webgl canvas系列——快速加背景、抠图、加水印并下载图片
    673 8
    webgl canvas系列——快速加背景、抠图、加水印并下载图片
    |
    JavaScript 前端开发
    JavaScriptDOM操作:怎样获取或修改一个元素的样式?
    JavaScriptDOM操作:怎样获取或修改一个元素的样式?
    828 0
    算法:图解递归算法的应用场景和使用途径
    算法:图解递归算法的应用场景和使用途径
    element中使用走马灯效果el-carousel点击按钮切换第几页demo效果示例(整理)
    element中使用走马灯效果el-carousel点击按钮切换第几页demo效果示例(整理)
    |
    9月前
    |
    NoSQL IDE MongoDB
    Studio 3T 2025.10 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
    Studio 3T 2025.10 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
    835 21
    Studio 3T 2025.10 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
    |
    11月前
    |
    存储 JSON 前端开发
    |
    人工智能 安全 JavaScript
    Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
    Open Interpreter 是一个让语言模型运行代码的强大工具,提供了一个类似 ChatGPT 的界面,支持多种编程语言和丰富的功能。
    1105 7
    Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
    |
    存储 缓存 资源调度
    关于npm镜像迁移导致的服务异常
    关于npm镜像迁移导致的服务异常
    619 0
    |
    API 数据格式
    IIIF 标准
    IIIF 标准
    848 0
    |
    JavaScript 前端开发
    【Vue 3】如何实现动态表单生成器的拖拽功能?
    【Vue 3】如何实现动态表单生成器的拖拽功能?