顺时针旋转画布90度并更新宽度高度

zaf*_*zaf 4 javascript canvas image-processing

假设我们有一个画布:

<canvas id="one" width="100" height="200"></canvas>
Run Code Online (Sandbox Code Playgroud)

然后在按钮上单击画布顺时针旋转90度(围绕中心),画布的尺寸也会更新,所以在某种意义上它后面看起来像这样:

<canvas id="one" width="200" height="100"></canvas>
Run Code Online (Sandbox Code Playgroud)

请注意,画布的id是相同的.

想象一下,只需顺时针旋转图像而不进行裁剪或填充.

在我这么做之前的任何建议还有很长的方法来创建一个新的画布并逐个像素地旋转和复制?

更新示例代码并提供评论建议仍然无效:

function imageRotatecw90(){

    var canvas = document.getElementById("one");
    var context = canvas.getContext("2d");

    var cw=canvas.width;
    var ch=canvas.height;

    var myImageData = context.getImageData(0,0, cw,ch);

    context.save();

    context.translate(cw / 2, ch / 2);
    context.rotate(Math.PI/2);

    context.putImageData(myImageData, 0, 0);

    context.restore();

    canvas.width=ch;
    canvas.height=cw;
}
Run Code Online (Sandbox Code Playgroud)

FiddleJS

Gus*_*lho 9

看看这个DEMO.

为了实现在演示中看到的结果,我利用canvas.toDataURL将画布缓存到图像中,然后将画布重置为新的尺寸,正确地平移和旋转上下文,最后将缓存的图像绘制回修改的画布.

这样您就可以轻松旋转画布而无需再次重绘所有内容.但是因为anti-aliasing浏览器使用的方法,每次执行此操作时,您会发现结果有些模糊.如果你不喜欢这种行为,我能想出的唯一解决方案是再次绘制所有内容,更难以跟踪.

以下是代码:

var canvas = document.getElementById("one");
var context = canvas.getContext("2d");
var cw = canvas.width;
var ch = canvas.height;

// Sample graphic
context.beginPath();
context.rect(10, 10, 20, 50);
context.fillStyle = 'yellow';
context.fill();
context.lineWidth = 7;
context.strokeStyle = 'black';
context.stroke();

// create button
var button = document.getElementById("rotate");
button.onclick = function () {
    // rotate the canvas 90 degrees each time the button is pressed
    rotate();
}

var myImageData, rotating = false;   

var rotate = function () {
    if (!rotating) {
        rotating = true;            
        // store current data to an image
        myImageData = new Image();
        myImageData.src = canvas.toDataURL();

       myImageData.onload = function () {
            // reset the canvas with new dimensions
            canvas.width = ch;
            canvas.height = cw;
            cw = canvas.width;
            ch = canvas.height;

            context.save();
            // translate and rotate
            context.translate(cw, ch / cw);
            context.rotate(Math.PI / 2);
            // draw the previows image, now rotated
            context.drawImage(myImageData, 0, 0);               
            context.restore();

            // clear the temporary image
            myImageData = null;

            rotating = false;               
        }
    }
}
Run Code Online (Sandbox Code Playgroud)