如何退回 HTML5 Canvas 的历史

Mat*_*att 2 html javascript jquery canvas

我有一个使用 Imgly HTML5 Canvas 插件的图像裁剪器。我需要能够为裁剪器设置一个历史堆栈,以便能够撤消裁剪操作。目前,我可以在单击按钮时清除画布,但我需要能够保留原始图像,并且如果裁剪步骤未正确完成,只需返回画布中图像更改的历史记录即可。

我有以下内容只是清除画布:

$("#renderButton").click(function() {
        var elem = $(".imgly-canvas");
        var canvas = elem.get(0);
        var context = canvas.getContext("2d");
        $('#file').val('');

        context.clearRect(0, 0, canvas.width, canvas.height);
        context.beginPath();
    });
Run Code Online (Sandbox Code Playgroud)

该插件在图像加载时创建画布元素:

Utils.getImageDataForImage = function(image) {
  var canvas, context;
  canvas = document.createElement("canvas");
  canvas.width = image.width;
  canvas.height = image.height;
  context = canvas.getContext("2d");
  context.drawImage(image, 0, 0);
  return context.getImageData(0, 0, image.width, image.height);
};
Run Code Online (Sandbox Code Playgroud)

这用于调整大小:

    Utils.cloneImageData = function(imageData) {
  var i, newImageData, _i, _ref;
  newImageData = this.sharedContext.createImageData(imageData.width, imageData.height);
  for (i = _i = 0, _ref = imageData.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
    newImageData.data[i] = imageData.data[i];
  }
  return newImageData;
};

/*
  @param {Object} dimensions
  @param {Integer} dimensions.width
  @param {Integer} dimensions.height
  @returns {HTMLCanvasElement}
*/


Utils.newCanvasWithDimensions = function(dimensions) {
  var canvas;
  canvas = document.createElement("canvas");
  canvas.width = dimensions.width;
  canvas.height = dimensions.height;
  return canvas;
};

/*
  @param {imageData} imageData
  @returns {HTMLCanvasElement}
*/


Utils.newCanvasFromImageData = function(imageData) {
  var canvas, context;
  canvas = document.createElement("canvas");
  canvas.width = imageData.width;
  canvas.height = imageData.height;
  context = canvas.getContext("2d");
  context.putImageData(imageData, 0, 0);
  return canvas;
};
Run Code Online (Sandbox Code Playgroud)

所以我不确定如何构建一个调用堆栈来引用每个更改并返回到画布中图像的修改历史。

Bri*_*ian 5

HTML5 画布很好地转换为 JSON,然后可用于重新加载画布。您可以将其存储在全局对象中。

var myObj = window.myObj || {};

myObj = {
    history: [],
    canvas: null
};
Run Code Online (Sandbox Code Playgroud)

获取画布数据:

myObj.canvas = document.getElementById('canvas-id');
var ctx = myObj.canvas.getContext('2d');
var data = JSON.stringify(ctx.getImageData(0, 0, myObj.canvas.width, myObj.canvas.height));

myObj.history.push(data);
Run Code Online (Sandbox Code Playgroud)

重新加载数据:

var reloadData = JSON.parse(myObj.history[someIndex]);
var ctx = myObj.canvas.getContext('2d');
ctx.putImageData(reloadData, 0, 0);
Run Code Online (Sandbox Code Playgroud)

一旦您可以存储/加载数据,棘手的部分就是管理myObj.history阵列。