【问题标题】:Draw multiple image's on canvas with each image rotated在画布上绘制多个图像,每个图像都旋转
【发布时间】:2013-11-06 20:27:56
【问题描述】:

我是 HTML5 编程的新手,我想知道在将每个图像添加到画布时如何旋转它。是否应该将它们中的每一个都放入画布然后旋转?如果是这样,我如何将多个画布添加到单个画布上下文中。

小提琴:http://jsfiddle.net/G7ehG/

代码

function loadImages(sources, callback) {
        var images = {};
        var loadedImages = 0;
        var numImages = 0;
        // get num of sources
        for(var src in sources) {
          numImages++;
        }
        for(var src in sources) {
          images[src] = new Image();
          images[src].onload = function() {
            if(++loadedImages >= numImages) {
              callback(images);
            }
          };
          images[src].src = sources[src];
        }
      }
      var canvas = document.getElementById('myCanvas');
      var context = canvas.getContext('2d');

      var sources = {
        image1: 'http://farm3.static.flickr.com/2666/3686946460_0acfa289fa_m.jpg',
        image2: 'http://farm4.static.flickr.com/3611/3686140905_cbf9824a49_m.jpg'
      };

      loadImages(sources, function(images) {
        context.drawImage(images.image1, 100, 30, 200, 137);
        context.drawImage(images.image2, 350, 55, 93, 104);
      });

【问题讨论】:

标签: javascript html html5-canvas


【解决方案1】:

在您的评论中,您提到您知道context.rotate,但您不希望上下文保持旋转。这根本不是问题。首先,调用context.rotate 只会影响之后绘制的内容。之前绘制的任何东西都会保留下来。其次,画完后可以轻松反转。

  1. 使用context.save() 创建所有当前上下文设置的快照,包括当前轮换。
  2. 使用context.rotate(angle) 并绘制您的图像。角度在Radian。这意味着一个完整的 360° 圆是Math.PI * 2。图像将旋转的点是画布的当前原点 (0:0)。当您想围绕其中心旋转图像时,使用context.translate(x, y) 将原点设置为您希望图像中心所在的位置,然后旋转,然后在坐标-img.width/ 2, -img.height / 2 处绘制图像
  3. 使用context.restore() 返回您的快照。旋转和平移现在将像以前一样。

这是一个示例函数,它在坐标 100,100 处绘制旋转 45° 的图像:

function drawRotated(image, context) {
    context.save();
    context.translate(100, 100);
    context.rotate(Math.PI / 4);
    context.drawImage(image, -image.width / 2, -image.height / 2);
    context.restore();
}

【讨论】:

  • 将函数签名更改为 drawRotated(context, img, x, y, angle) 这应该是答案。 (也许在 CanvasRenderingContext2D 的原型上设置这个方法……?)
  • @GameAlchemist 将字段添加到您未编写的对象或原型可能很危险,因为存在覆盖已存在字段的风险。
猜你喜欢
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多