How to rotate the existing content of HTML5 canvas?

前端 未结 2 1703
情深已故
情深已故 2021-01-13 05:27

Is there a way to rotate the existing content of HTML5 canvas by Javascript? I know it\'s possible to rotate an image that will be drawn on to canvas, but I want to rotate t

相关标签:
2条回答
  • 2021-01-13 06:25

    If you first want to draw on a canvas and then rotate it for use on e.g. corners, you can to that when you "clone" the canvas or by using CSS.

    Examples

    Get the first canvas element:

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

    draw on it:

    ctx.fillStyle = 'blue';
    ctx.fillRect(0,0, 25, 5);
    ctx.fill();
    ctx.fillStyle = 'red';
    ctx.fillRect(25, 0, 25, 5);
    ctx.fill();
    

    clone it to another canvas (that is rotated by CSS):

    var ctx2 = document.getElementById("canvas2").getContext("2d");
    ctx2.drawImage(canvas, 0,0);
    

    or rotate the canvas while you "clone" it:

    var ctx3 = document.getElementById("canvas3").getContext("2d");
    ctx3.rotate(Math.PI/2);
    ctx3.translate(0,-50);
    ctx3.drawImage(canvas, 0,0);
    

    here is the CSS for rotating it:

    #canvas2 {
        -webkit-transform:rotate(90deg);
        -moz-transform:rotate(90deg);
        -o-transform:rotate(90deg);
        -ms-transform:rotate(90deg);
    }
    

    enter image description here

    Here is the full example:

    <!DOCTYPE html>
    <html>
    <head>
    <script>
    window.onload = function() {
        var canvas = document.getElementById("canvas");
        var ctx = canvas.getContext("2d");
    
        ctx.fillStyle = 'blue';
        ctx.fillRect(0,0, 25, 5);
        ctx.fill();
        ctx.fillStyle = 'red';
        ctx.fillRect(25, 0, 25, 5);
        ctx.fill();
    
        var ctx2 = document.getElementById("canvas2").getContext("2d");
        ctx2.drawImage(canvas, 0,0);
    
        var ctx3 = document.getElementById("canvas3").getContext("2d");
        ctx3.rotate(Math.PI/2);
        ctx3.translate(0,-50);
        ctx3.drawImage(canvas, 0,0);
    
    }
    </script>
    <style>
    #canvas2 {
        -webkit-transform:rotate(90deg);
        -moz-transform:rotate(90deg);
        -o-transform:rotate(90deg);
        -ms-transform:rotate(90deg);
    }
    </style>
    </head>
    <body>
    <canvas id="canvas" width="50" height="50"></canvas>
    <canvas id="canvas2" width="50" height="50"></canvas>
    <canvas id="canvas3" width="50" height="50"></canvas>
    </body>
    </html>
    
    0 讨论(0)
  • 2021-01-13 06:28

    It's pretty easy to do with a temp canvas.

    Live Demo

    Live Demo Animated (just for the heck of it)

    The above example draws 2 boxes, then rotates and scales from 0,0 to 200,200

    var canvas = document.getElementById("canvas"),
        ctx = canvas.getContext("2d");
    
    canvas.width = canvas.height = 400;
    
    // fill the canvas black, and draw 2 boxes
    ctx.fillStyle = "#000";
    ctx.fillRect(0,0,400,400);
    ctx.fillStyle = "rgb(255,0,0)";
    
    ctx.fillRect(10,10,190,190);
    ctx.fillStyle = "rgb(255,255,0)";
    ctx.fillRect(250,250,90,90);
    
    // Create a temp canvas to store our data (because we need to clear the other box after rotation.
    var tempCanvas = document.createElement("canvas"),
        tempCtx = tempCanvas.getContext("2d");
    
    tempCanvas.width = canvas.width;
    tempCanvas.height = canvas.height;
    // put our data onto the temp canvas
    tempCtx.drawImage(canvas,0,0,canvas.width,canvas.height);
    
    // Append for debugging purposes, just to show what the canvas did look like before the transforms.
    document.body.appendChild(tempCanvas);
    
    // Now clear the portion to rotate.
    ctx.fillStyle = "#000";
    ctx.fillRect(0,0,200,200);
    ctx.save();
    // Translate (190/2 is half of the box we drew)
    ctx.translate(190/2, 0);
    // Scale
    ctx.scale(0.5,0.5);  
    // Rotate it
    ctx.rotate(45*Math.PI/180);
    // Finally draw the image data from the temp canvas.
    ctx.drawImage(tempCanvas,0,0,200,200,10,10,190,190);
    ctx.restore();
    
    0 讨论(0)
提交回复
热议问题