我想创建一个以与平常不同的方式显示二维上下文的函数。有点像变换工作。而不是弯曲/改变上下文的大小我想让它像波浪一样。这个想法是,这必须来自上下文,而不是来自数据图像。没有位操纵。
类似的请求在这里完成:How to distort an image to create flag waving in the wind effect using html5 canvas但是有位操作。
重点是通过减少位操作来提高性能。
编辑:我需要创建链接(上面的链接)中描述的相同功能,但有一点不同。链接已回答,因此您可以理解我的意思。在该示例中,这通过位操作来执行。我想做同样的事情,但是从上下文的角度来看。就像使用context.transform(..)函数完成的那样。
Context.transform函数的示例:http://www.html5canvastutorials.com/advanced/html5-canvas-custom-transform/(您可以更改tranfsorm函数的参数以获得效果)
希望能够解决它。
答案 0 :(得分:1)
您可以使用着色器进行优化,以便将工作负载转移到GPU,但这是3d/webgl
上下文。
对于2d
,您只需要按像素级别进行操作,没有别的办法。
如果通过这个
这个想法是,这必须来自上下文
你的意思是:要拥有被一些振荡力转换的物体,那么你应该寻找物理引擎:box2djs浮现在脑海中。
p2.js有一个很好的弹簧演示。
答案 1 :(得分:1)
您可以使用context.drawImage
绘制1像素宽的垂直切片,使用"波浪" y偏移量。强>
这种方法可以提供良好的性能,因为您可以一次性绘制图像的整个高度而不是像素一样。此外,绘制过程比像素操作快得多,因为所需的像素从图像到画布是blitted。当GPU可用时,此方法使用GPU加速。
示例代码和演示:http://jsfiddle.net/m1erickson/bcjmxr80/
<!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; }
canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var img=new Image();
img.onload=start;
img.src=document.getElementById("source").src;
function start(){
var iw=img.width;
var ih=img.height;
canvas.width=iw+100;
canvas.height=ih+100;
for(var x=0;x<310;x++){
var y=5*Math.sin(x/10)+200-162;
ctx.drawImage(img, x,0,1,ih, x,y,1,ih);
}
}
}); // end $(function(){});
</script>
</head>
<body>
<h4>Original Image</h4>
<img id=source src="https://dl.dropboxusercontent.com/u/139992952/multple/usaFlag.png"><br>
<h4>Wavy using vertical slices in canvas</h4>
<canvas id="canvas"></canvas>
</body>
</html>