简体   繁体   English

具有角度的HTML5画布drawImage

[英]HTML5 canvas drawImage with at an angle

I am experimenting with animation in <canvas> and can't work out how to draw an image at an angle. 我正在<canvas>试验动画,但无法确定如何以一定角度绘制图像。 The desired effect is a few images drawn as usual, with one image rotating slowly. 期望的效果是像往常一样绘制的一些图像,其中一个图像缓慢旋转。 (This image is not at the centre of the screen, if that makes any difference). (如果这有任何区别,则此图像不在屏幕的中心)。

You need to modify the transformation matrix before drawing the image that you want rotated. 在绘制要旋转的图像之前,需要修改变换矩阵。

Assume image points to an HTMLImageElement object. 假设图像指向HTMLImageElement对象。

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

context.translate(x, y);
context.rotate(angleInRadians);
context.drawImage(image, -width / 2, -height / 2, width, height);
context.rotate(-angleInRadians);
context.translate(-x, -y);

The x, y coordinates is the center of the image on the canvas. x,y坐标是画布上图像的中心。

I have written a function (based on Jakub's answer) that allows user to paint an image in a X,Y position based on a custom rotation in a custom rotation point: 我编写了一个函数(基于Jakub的答案),允许用户根据自定义旋转点中的自定义旋转在X,Y位置绘制图像:

function rotateAndPaintImage ( context, image, angleInRad , positionX, positionY, axisX, axisY ) {
  context.translate( positionX, positionY );
  context.rotate( angleInRad );
  context.drawImage( image, -axisX, -axisY );
  context.rotate( -angleInRad );
  context.translate( -positionX, -positionY );
}

Then you can call it like this: 然后你可以像这样调用它:

var TO_RADIANS = Math.PI/180; 
ctx = document.getElementById("canvasDiv").getContext("2d");
var imgSprite = new Image();
imgSprite.src = "img/sprite.png";

// rotate 45º image "imgSprite", based on its rotation axis located at x=20,y=30 and draw it on context "ctx" of the canvas on coordinates x=200,y=100
rotateAndPaintImage ( ctx, imgSprite, 45*TO_RADIANS, 200, 100, 20, 30 );

It is interesting that the first solution worked for so many people, it didn't give the result I needed. 有趣的是,第一个解决方案适用于这么多人,它没有给出我需要的结果。 In the end I had to do this: 最后我不得不这样做:

ctx.save();
ctx.translate(positionX, positionY);
ctx.rotate(angle);
ctx.translate(-x,-y);
ctx.drawImage(image,0,0);
ctx.restore();

where (positionX, positionY) is the coordinates on the canvas that I want the image to be located at and (x, y) is the point on the image where I want the image to rotate. 其中(positionX, positionY)是我希望图像位于画布上的坐标,而(x, y)是图像上我希望图像旋转的点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM