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系列——快速加背景、抠图、加水印并下载图片
    506 8
    webgl canvas系列——快速加背景、抠图、加水印并下载图片
    |
    10月前
    |
    人工智能 安全 JavaScript
    Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
    Open Interpreter 是一个让语言模型运行代码的强大工具,提供了一个类似 ChatGPT 的界面,支持多种编程语言和丰富的功能。
    495 7
    Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
    |
    JavaScript Unix Linux
    ⨯ cannot execute cause=fork/exec...pnpm\bin\pnpm.cjs: %1 is not a valid Win32 application.
    ⨯ cannot execute cause=fork/exec...pnpm\bin\pnpm.cjs: %1 is not a valid Win32 application.
    930 0
    |
    前端开发
    【vue3】前端实现 生成条形码并调用打印机打印
    【vue3】前端实现 生成条形码并调用打印机打印
    1213 1
    |
    11月前
    |
    JavaScript 前端开发 网络架构
    vue 路由器history和hash工作模式
    vue 路由器history和hash工作模式
    |
    10月前
    |
    前端开发 JavaScript
    怎么在vite项目中全局导入一个scss文件
    在Vite项目中全局导入SCSS文件的方法:通过配置`vite.config.js`中的`css.preprocessorOptions.scss.additionalData`属性,可以将SCSS变量或混合内容全局引入。此方法同样适用于LESS文件。详情参见Vite官方文档。
    630 1
    怎么在vite项目中全局导入一个scss文件
    |
    JavaScript
    cnpm 的安装与使用
    本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
    cnpm 的安装与使用
    |
    JavaScript
    解决在vue中设置的height: 100%没有效果
    文章讲述了在Vue中设置`height: 100%`无效的问题,并提供了解决方法:确保`html`、`body`和`#app`元素的高度都设置为`100%`,以保证子元素的高度能正确继承父元素的高度。
    解决在vue中设置的height: 100%没有效果
    |
    API 数据格式
    IIIF 标准
    IIIF 标准
    597 0
    |
    数据采集 机器学习/深度学习 文字识别
    OCR -- 文本检测 - 训练DB文字检测模型
    OCR -- 文本检测 - 训练DB文字检测模型
    327 0