Javascript 如何回顾HTML5画布历史
我有一个使用Imgly HTML5画布插件的图像裁剪器。我需要能够为裁剪器设置历史堆栈,以便能够撤消裁剪操作。目前,我可以在单击按钮时清除画布,但我需要能够保留原始图像,并在裁剪步骤不正确的情况下返回画布中图像更改的历史记录 我有以下简单地清除画布的方法:Javascript 如何回顾HTML5画布历史,javascript,jquery,html,canvas,Javascript,Jquery,Html,Canvas,我有一个使用Imgly HTML5画布插件的图像裁剪器。我需要能够为裁剪器设置历史堆栈,以便能够撤消裁剪操作。目前,我可以在单击按钮时清除画布,但我需要能够保留原始图像,并在裁剪步骤不正确的情况下返回画布中图像更改的历史记录 我有以下简单地清除画布的方法: $("#renderButton").click(function() { var elem = $(".imgly-canvas"); var canvas = elem.get(0); va
$("#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();
});
插件在图像加载时使用以下命令创建画布元素:
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);
};
这用于调整大小:
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;
};
Utils.cloneImageData=函数(imageData){
var i,newImageData,_i,_ref;
newImageData=this.sharedContext.createImageData(imageData.width,imageData.height);
对于(i=_i=0,_ref=imageData.data.length;0 _ref;i=0,HTML5画布会很好地转换为JSON,然后用于重新加载画布。您可以将其存储在全局对象中
var myObj = window.myObj || {};
myObj = {
history: [],
canvas: null
};
获取画布数据:
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);
重新加载数据:
var reloadData = JSON.parse(myObj.history[someIndex]);
var ctx = myObj.canvas.getContext('2d');
ctx.putImageData(reloadData, 0, 0);
一旦您可以存储/加载数据,棘手的部分就是管理myObj.history
数组。您应该查看。基本上,您需要为用户可以执行的每个操作编写一个函数。当用户单击按钮或加载图像时,不要立即调用该函数。而是创建一个包含所有所需信息的命令对象编辑以执行该命令以及撤消该命令所需的信息
命令应用于数据模型(图像和裁剪标记)。命令“加载图像”需要记录新的和以前的图像URL,以便在历史记录中移动时加载正确的图像
对于裁剪命令,如果保留原始图像的副本,则需要存储旧的和新的裁剪矩形。执行该命令时,将新的裁剪矩形应用于原始图像并在画布上绘制
对于“撤消”,使用原始图像和上一个裁剪矩形
因此,诀窍是定义一个数据模型,其中包含UI外观的所有信息(通常很难直接从UI获取-在将裁剪后的图像呈现到画布上后无法获取裁剪信息)。然后,命令操作此状态(以便下一个命令可以将其保存以供撤消)并更新UI