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

问题描述 投票:0回答:4

当我在 HTML 画布上绘制图像时,我尝试翻转/镜像图像;我发现一个游戏教程显示了角色必须面对的每个方向的精灵表,但这对我来说似乎不太正确。特别是因为每个框架都有不同的尺寸。

实现这一目标的最佳技术是什么?

我尝试调用画布上的

setScale(-1, 1);
,但没有成功。也许这不是这个目的。

谢谢

javascript html canvas flip mirror
4个回答
39
投票
  1. 您可以通过在绘制图像之前使用

    myContext.scale(-1,1)
    转换上下文来完成此操作,但是

  2. 这会减慢你的游戏速度。最好有一个单独的、反转的精灵。


31
投票

您需要设置画布的比例以及反转宽度。

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

这可能存在一些性能问题,但对我来说这不是问题。


13
投票

如果你只是水平翻转它,它就会越界...所以使用

translate
来调整它的位置:

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

对于较短的代码,您可以删除

translate
并使用图像大小作为
drawImage
(x 坐标)的第二个参数中的负偏移量:

ctx.scale(-1, 1);
ctx.drawImage(img, canvas.width * -1, 0);

如果您想稍后恢复上下文,请在其前后添加

save/restore

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

4
投票

创建倒影时无需重新绘制整个图像。原始反射仅显示图像的底部部分。通过这种方式,您可以重新绘制图像的较小部分,从而提供更好的性能,并且您不需要创建线性渐变来隐藏图像的下部(因为您从不绘制它)。

 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>

© www.soinside.com 2019 - 2024. All rights reserved.