javascript - 在 Canvas 上旋转 2 个图像

标签 javascript html jquery-mobile canvas

我必须在 Canvas 上绘制 3 个图像,并且需要旋转其中 2 个图像。

图像就像 1. 带有垂直直线的圆形 2.只是一条水平线 3.大圆形图片

我需要旋转 Canvas 中心的前两张图像。

var canvas = document.getElementById('NewImage');
    var context = canvas.getContext('2d');
    context.canvas.width  = window.innerWidth;
    context.canvas.height = window.innerHeight*0.7;
    var imageObj = new Image();
    var imageObj2 = new Image();
    var imageObj3 = new Image();

    imageObj.onload = function() {
        context.save();    
        context.translate(imageObj.width/2,imageObj.height/2);
        context.rotate(-10*Math.PI/180);
        //context.translate(-imageObj.width/2,-imageObj.height/2);
        context.drawImage(imageObj,-(imageObj.width/2),-(imageObj.height/2),context.canvas.width,context.canvas.height*0.85);
        context.restore();
        context.save();
        context.globalCompositeOperation="source-over";
        context.translate(imageObj2.width/2,imageObj2.height/2);
        context.rotate(-10*Math.PI/180);
        context.translate(-imageObj2.width/2,-imageObj2.height/2);
        context.drawImage(imageObj2, x, y,context.canvas.width,6);
        context.restore();
        //context.rotate(10*Math.PI/180);
        context.drawImage(imageObj3, 0, 0,context.canvas.width,context.canvas.height*0.9);

    };
    imageObj.src  = 'canvas/inner_circle_blackline_vertical.png';
    imageObj2.src = 'canvas/horizontal.png';
    imageObj3.src = 'canvas/outer_circle.png';

当我尝试旋转时,图像没有在中心旋转。当第 2 个图像旋转时,它必须看起来像“X”符号。

我将如何在 Canvas 中心旋转。

谢谢:)

最佳答案

按照设计,您的 imageObj2 和 imageObj3 将永远不会加载。

这是一个通用图像加载器,它将加载所有图像并将它们存储在名为 imgs[] 的数组中。

当所有图像完全加载后,将调用 render() 函数。这就是你开始绘画的地方。

// This is an image loader 
// When render() is called, all your images are fully loaded
var imgURLs = [
    "https://dl.dropboxusercontent.com/u/139992952/stackoverflow/line.png",
    "https://dl.dropboxusercontent.com/u/139992952/stackoverflow/line.png",
    "https://dl.dropboxusercontent.com/u/139992952/stackoverflow/line.png"];
var imgs=[];
var imgCount=0;

pre_load();

function pre_load(){

    for(var i=0;i<imgURLs.length;i++){

        var img=new Image();
        imgs.push(img);
        img.onload=function(){        

            if(++imgCount>=imgs.length){ 
                // images are now fully loaded
                render(); 
            }

        }
        img.src=imgURLs[i];
    }
}

在 render() 中,您只需绘制图像。

由于重复执行相同的操作(旋转图像),因此您可以创建一个辅助函数来执行旋转绘图。这里的辅助函数是drawImageAtAngle。

// draw the rotated lines on the canvas
function render(){

    var x=canvas.width/2;
    var y=canvas.height/2;

    drawImageAtAngle(imgs[0],x,y,-45);
    drawImageAtAngle(imgs[2],x,y,45);
    drawImageAtAngle(imgs[1],x,y,0);
}

这里的辅助函数将提供的图像旋转到提供的 Angular :

function drawImageAtAngle(image,X,Y,degrees){
    var radians=degrees*Math.PI/180;
    var halfWidth=image.width/2;
    var halfHeight=image.height/2;
    ctx.beginPath();
    ctx.save();
    ctx.translate(X,Y);
    ctx.rotate(radians);
    ctx.drawImage(image,-halfWidth,-halfHeight);
    ctx.restore();
}

这是代码和 fiddle :http://jsfiddle.net/m1erickson/ZShWW/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<style>
    body{ background-color: ivory; padding:10px;}
    canvas{border:1px solid red;}
</style>

<script>
$(function(){

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

    // This is an image loader 
    // When render() is called, all your images are fully loaded
    var imgURLs = [
        "https://dl.dropboxusercontent.com/u/139992952/stackoverflow/line.png",
        "https://dl.dropboxusercontent.com/u/139992952/stackoverflow/line.png",
        "https://dl.dropboxusercontent.com/u/139992952/stackoverflow/line.png"];
    var imgs=[];
    var imgCount=0;

    pre_load();

    function pre_load(){

        for(var i=0;i<imgURLs.length;i++){

            var img=new Image();
            imgs.push(img);
            img.onload=function(){        

                if(++imgCount>=imgs.length){ 
                    // images are now fully loaded
                    render(); 
                }

            }
            img.src=imgURLs[i];
        }
    }


    // draw the rotated lines on the canvas
    function render(){

        var x=canvas.width/2;
        var y=canvas.height/2;

        drawImageAtAngle(imgs[0],x,y,-45);
        drawImageAtAngle(imgs[2],x,y,45);
        drawImageAtAngle(imgs[1],x,y,0);
    }


    function drawImageAtAngle(image,X,Y,degrees){
        var radians=degrees*Math.PI/180;
        var halfWidth=image.width/2;
        var halfHeight=image.height/2;
        ctx.beginPath();
        ctx.save();
        ctx.translate(X,Y);
        ctx.rotate(radians);
        ctx.drawImage(image,-halfWidth,-halfHeight);
        ctx.restore();
    }





}); // end $(function(){});
</script>

</head>

<body>
    <p>This is the line image</p>
    <img src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/line.png">
    <p>The line image rotated at center of canvas</p>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

关于javascript - 在 Canvas 上旋转 2 个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17487277/

相关文章:

javascript - 将自定义验证器动态附加到控件时出现问题

javascript - 如何在 react-native 中编写特定于 flavor 的代码?

html - Font-Family 在同一个标​​题上使用不同的字体

javascript - 无法通过 JavaScript 设置 div.style.left 和 div.style.top css 属性

jquery - 禁用 jQuery Mobile 地址栏隐藏

javascript - 菜单粘贴触发了哪个事件?

javascript - Angular JS 下拉列表。从弹出窗口中选择一个值应该更新下拉列表的值

html - 简单的横幅广告 - 是否有更好的桌面和移动布局方式? ( flex 盒/CSS 网格)

jquery 移动对话框,在页面之间传递值

javascript - 输入 OnClick 无法识别