CamanJS还原并旋转修复

时间:2014-03-20 07:54:14

标签: javascript canvas rotation camanjs

如果您在CamanJS中使用旋转插件,则在尝试还原更改时会出现问题。 Caman只能以裁剪或调整图像大小的方式实现,但不能在旋转时实现。当您还原并且图像旋转时,图像重新加载失真,因为它没有考虑到画布已旋转并改变了大小。此外,画布的imageData.data现在也不同了。所以我认为我通过查看他如何实现调整大小来修复它。基本上我做了什么(他也做了):

  1. 以初始状态创建画布
  2. 从initialState
  3. 更新pixelData
  4. 制作新画布
  5. 用初始图像旋转他
  6. 获取ImageData并重新呈现它们
  7. 所以我加了。我需要知道图像旋转了多少角度,这样我就可以在旋转新画布时获得正确的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;
    }
    

    那就是它。

    我用它并且到目前为止工作。你怎么看?希望它有所帮助

1 个答案:

答案 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

在此之前将我的图像更改为切割。