Rotate an image around its center in canvas

后端 未结 3 1160
暖寄归人
暖寄归人 2020-12-10 12:56

I\'m trying to do my first image animation on canvas. I want the image to rotate but something is not correct in my code. Any ideas? This is all in a jquery document ready:

相关标签:
3条回答
  • 2020-12-10 13:19

    just change the order of your code, i.e.,

    ctx.rotate(...);
    
    ctx.drawImage(...);
    

    See a working example http://jsbin.com/owuyiq/

    $(function () {
        var canvas = document.getElementById('logobg1');
        var ctx = canvas.getContext('2d');
        var img = new Image();
    
        var ang = 0; //angle
        var fps = 1000 / 25; //number of frames per sec
        img.onload = function () { //on image load do the following stuff
            canvas.width = this.width << 1; //double the canvas width
            canvas.height = this.height << 1; //double the canvas height
            var cache = this; //cache the local copy of image element for future reference
            setInterval(function () {
                ctx.save(); //saves the state of canvas
                ctx.clearRect(0, 0, canvas.width, canvas.height); //clear the canvas
                ctx.translate(cache.width, cache.height); //let's translate
                ctx.rotate(Math.PI / 180 * (ang += 5)); //increment the angle and rotate the image 
                ctx.drawImage(img, -cache.width / 2, -cache.height / 2, cache.width, cache.height); //draw the image ;)
                ctx.restore(); //restore the state of canvas
            }, fps);
        };
    
        img.src = 'http://i.stack.imgur.com/Z97wf.jpg?s=128'; //img
    });
    
    0 讨论(0)
  • 2020-12-10 13:24

    Based in the accepted answer, this example, allows you to use a fixed canvas size (and not in relation to the image size):

     $(function() {
     
            var canvas = document.getElementById('logobg1');
            var ctx = canvas.getContext('2d');
            var img = new Image();
        
            var ang = 0; //angle
            var fps = 1000 / 25; //number of frames per sec
            img.onload = function () { //on image load do the following stuff
                canvas.width = 500; //Any width
                canvas.height = 500; //Any height
                var cache = this; //cache the local copy of image element for future reference
                var iw = cache.width;
                var ih = cache.height;
                setInterval(function () {
                    ctx.save(); //saves the state of canvas
                    ctx.clearRect(0, 0, canvas.width, canvas.height); //clear the canvas
                    ctx.translate(canvas.width/2, canvas.height/2); //let's translate
                    ctx.rotate(Math.PI / 180 * (ang += 5)); //increment the angle and rotate the image 
                    ctx.translate(-(canvas.width/2), -(canvas.height/2)); //let's translate
                    ctx.drawImage(img, canvas.width/2 - iw/2, canvas.height/2 - ih/2, iw, ih); //draw the image ;)
                    ctx.restore(); //restore the state of canvas
                }, fps);
            };
            
            img.src = 'https://lh4.ggpht.com/wKrDLLmmxjfRG2-E-k5L5BUuHWpCOe4lWRF7oVs1Gzdn5e5yvr8fj-ORTlBF43U47yI=w300'; //img
     
     })
     
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <canvas id="logobg1" > test canvas <canvas>

    Working example: jsbin.com/suwovibove/

    Note: try removing ctx.save and ctx.restore for a cool spin.

    0 讨论(0)
  • 2020-12-10 13:40

    Based on the comments above, but a bit more simple and in vanilla. This one worked for me perfectly. Of course you should use clearRect in order to erase the canvas on each rendering.

    var canvas = document.querySelector('#my-canvas');
    var ctx = canvas.getContext('2d')
    var ang = 0
    
    function rotateAndRenderImg() {
        var img = document.querySelector('img')
        ctx.save()
        var pos = {x: desiredRenderPosX, y: desiredRenderPosY}
        ctx.translate(pos.x ,pos.y)    
        ctx.rotate(Math.PI / 180 * (ang += 5))
        ctx.drawImage(img, -img.width / 2, -img.height / 2, img.width, img.height)
        ctx.restore()
    }

    0 讨论(0)
提交回复
热议问题