1

CamanJS で回転プラグインを使用する場合、変更を元に戻そうとすると問題が発生します。Caman は、画像をトリミングまたはサイズ変更するときに適切に機能する方法でのみ実装されますが、回転するときはそうではありません. 元に戻して画像を回転すると、キャンバスが回転してサイズが変更されたことを考慮していないため、画像が歪んでリロードされます。また、キャンバスの imageData.data も異なります。それで、彼がサイズ変更をどのように実装したかを見て、私はそれを修正したと思います。基本的に私がしたこと(そして彼もそうです)は次のとおりです。

  1. 初期状態でキャンバスを作成する
  2. 彼の pixelData を initialState から更新します
  3. 新しいキャンバスを作成する
  4. 最初の画像で彼を回転させます
  5. ImageData を取得して再レンダリングする

だから私が追加したもの。新しいキャンバスを回転するときに正しい 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);
}

オリジナルのVisiblePixels プロトタイプでは:

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;
}

以上です。

私はそれを使用し、これまでのところ動作します。どう思いますか?お役に立てば幸いです

4

1 に答える 1