如果您在CamanJS中使用旋转插件,则在尝试还原更改时会出现问题。 Caman只能以裁剪或调整图像大小的方式实现,但不能在旋转时实现。当您还原并且图像旋转时,图像重新加载失真,因为它没有考虑到画布已旋转并改变了大小。此外,画布的imageData.data现在也不同了。所以我认为我通过查看他如何实现调整大小来修复它。基本上我做了什么(他也做了):
所以我加了。我需要知道图像旋转了多少角度,这样我就可以在旋转新画布时获得正确的imageData(步骤4)。
this.angle=0; //added it in the constructor
我还在构造函数中添加了一个新的布尔值,告诉我画布是否已旋转
this.rotated = false;
在旋转的插件中:
Caman.Plugin.register("rotate", function(degrees) {
//....
//....
//....
this.angle += degrees;
this.rotated = true;
return this.replaceCanvas(canvas);
}
并在originalVisiblePixels原型上:
else if (this.rotated){
canvas = document.createElement('canvas');//Canvas for initial state
canvas.width = this.originalWidth; //give it the original width
canvas.height = this.originalHeight; //and original height
ctx = canvas.getContext('2d');
imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
pixelData = imageData.data;//get the pixelData (length equal to those of initial canvas
_ref = this.originalPixelData; //use it as a reference array
for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
pixel = _ref[i];
pixelData[i] = pixel; //give pixelData the initial pixels
}
ctx.putImageData(imageData, 0, 0); //put it back on our canvas
rotatedCanvas = document.createElement('canvas'); //canvas to rotate from initial
rotatedCtx = rotatedCanvas.getContext('2d');
rotatedCanvas.width = this.canvas.width;//Our canvas was already rotated so it has been replaced. Caman's canvas attribute is allready rotated, So use that width
rotatedCanvas.height = this.canvas.height; //the same
x = rotatedCanvas.width / 2; //for translating
y = rotatedCanvas.width / 2; //same
rotatedCtx.save();
rotatedCtx.translate(x, y);
rotatedCtx.rotate(this.angle * Math.PI / 180); //rotation based on the total angle
rotatedCtx.drawImage(canvas, -canvas.width / 2, -canvas.height / 2, canvas.width, canvas.height); //put the image back on canvas
rotatedCtx.restore(); //restore it
pixelData = rotatedCtx.getImageData(0, 0, rotatedCanvas.width, rotatedCanvas.height).data; //get the pixelData back
width = rotatedCanvas.width; //used for returning the pixels in revert function
}
您还需要在重置原型函数中添加一些重置。基本重置角度和旋转
Caman.prototype.reset = function() {
//....
//....
this.angle = 0;
this.rotated = false;
}
那就是它。
我用它并且到目前为止工作。你怎么看?希望它有所帮助
答案 0 :(得分:0)
多亏了这一点,它经过一次微小的改变后才起作用。
在originalVisiblePixels原型中的else if语句中我改变了:
x = rotatedCanvas.width / 2; //for translating
y = rotatedCanvas.width / 2; //same
为:
x = rotatedCanvas.width / 2; //for translating
y = rotatedCanvas.height/ 2; //same
在此之前将我的图像更改为切割。