简体   繁体   English

HTML Canvas:如何绘制翻转/镜像图像?

[英]HTML Canvas: How to draw a flipped/mirrored image?

I'm trying to flip/mirror an image as I paint it on an HTML canvas;我正在尝试在 HTML 画布上绘制图像时翻转/镜像图像; I found a game tutorial showing a sprite sheet per direction a character has to face, but this doesn't seem quite right to me.我找到了一个游戏教程,显示了角色必须面对的每个方向的精灵表,但这对我来说似乎不太合适。 Especially since each frame has a different size.特别是因为每个帧都有不同的大小。

What would be the best technique to reach this goal?达到这个目标的最佳技术是什么?

I tried to call the setScale(-1, 1);我试图调用setScale(-1, 1); on my canvas with no success.在我的画布上没有成功。 Maybe that isn't meant for this.也许这不是为了这个。

Thanks谢谢

  1. You can do this by transforming the context with myContext.scale(-1,1) before drawing your image, however您可以通过在绘制图像之前使用myContext.scale(-1,1)转换上下文来做到这一点,但是

  2. This is going to slow down your game.这会减慢你的游戏速度。 It's a better idea to have a separate, reversed sprite.拥有一个单独的反向精灵是一个更好的主意。

You need to set the scale of the canvas as well as inverting the width.您需要设置画布的比例以及反转宽度。

drawToCanvas : function(v, context, width, height){
    context.save();
    context.scale(-1, 1);
    context.drawImage(v, 0, 0, width*-1, height);
    context.restore();
}

There are probably some performance issues with this but for me that was not an issue.这可能存在一些性能问题,但对我来说这不是问题。

Add this piece of code before the drawImage .drawImage之前添加这段代码。 If you just flip it horizontally it will get off of bounds... so use translate to adjust its position:如果你只是水平翻转它会越界......所以使用translate来调整它的位置:

ctx.translate(canvas.width, 0);
ctx.scale(-1, 1);

If you want to restore the context later, add save/restore :如果您想稍后恢复上下文,请添加save/restore

ctx.save();
ctx.translate(canvas.width, 0);
ctx.scale(-1, 1);
ctx.drawImage(img, 0, 0);
ctx.restore();

You don't need to redraw the entire image when creating a reflection.创建反射时不需要重新绘制整个图像。 An original reflection simply shows the bottom part of the image.原始反射仅显示图像的底部。 This way you are redrawing a smaller part of the image which provides better performance and also you don't need to create linear gradient to hide the lower part of the image (since you never draw it).通过这种方式,您可以重新绘制图像的较小部分,从而提供更好的性能,而且您无需创建线性渐变来隐藏图像的下部(因为您从未绘制过它)。

 var img = new Image(); img.src = "//vignette2.wikia.nocookie.net/tomandjerryfan/images/9/99/Jerry_Mouse.jpg/revision/latest?cb=20110522075610"; img.onload = function() { var thumbWidth = 250; var REFLECTION_HEIGHT = 50; var c = document.getElementById("output"); var ctx = c.getContext("2d"); var x = 1; var y = 1; //draw the original image ctx.drawImage(img, x, y, thumbWidth, thumbWidth); ctx.save(); //translate to a point from where we want to redraw the new image ctx.translate(0, y + thumbWidth + REFLECTION_HEIGHT + 10); ctx.scale(1, -1); ctx.globalAlpha = 0.25; //redraw only bottom part of the image //g.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); ctx.drawImage(img, 0, img.height - REFLECTION_HEIGHT, img.width, REFLECTION_HEIGHT, x, y, thumbWidth, REFLECTION_HEIGHT); // Revert transform and scale ctx.restore(); };
 body { background-color: #FFF; text-align: center; padding-top: 10px; }
 <canvas id="output" width="500" height="500"></canvas>

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

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