所有分类
  • 所有分类
  • 后端开发
XHTML弄出Chroma-keying效果,化身虚拟场景

XHTML弄出Chroma-keying效果,化身虚拟场景

这些将在我们实现chroma-keying特效时使用。computeFrame()方法,如下所示,实际上负责抓取每一帧的数据和执行chroma-keying特效。它提供了原始的32位像素图像数据,这样我们就能够进行操作。更多HTML5:使用

来聊聊怎么用XHTML弄出“Chroma-keying”效果,就是给视频换个色,让它看上去像个虚拟场景。看好了,只需要俩canvas元素,再加些Javascript代码,最后搞下Chroma-key初始化就行!




body {
background: black;
color:#CCCCCC;
}
#c2 {
background-image: url(foo.png);
background-repeat: no-repeat;
}
p {
float: left;
border :1px solid #444444;
padding:10px;
margin: 10px;
background:#3B3B3B;
}




创建两个Canvas元素

我们先在XHTML文件里加上俩Canvas元素,命名为c1和c2。这就是用的Chroma-keying技术里的主角儿了。c1看原视频,c2处理过的画面。然后在c2上贴个静止图,把视频里的特定背景色改成其他的,就能做出虚拟场景合成的效果。

导入JavaScript代码

下面开始加入Javascript代码!别忘了把版本号加到1.8上,否则可能运行不出来。这个脚本里共有3种方法,最先出现的就是doLoad()。doLoad()这个家伙,你可以理解为XHTML文档刚刚打开时就会蹦出来。它主要是预先设置好我们用来处理颜色键的变量,还会设置一些侦听器,这样我们就能在用户观看视频时随时监控了。

doLoad: function() {
this.video = document.getElementById("video");
this.c1 = document.getElementById("c1");
this.ctx1 = this.c1.getContext("2d");
this.c2 = document.getElementById("c2");
this.ctx2 = this.c2.getContext("2d");
let self = this;
this.video.addEventListener("play", function() {
self.width = self.video.videoWidth / 2;
self.height = self.video.videoHeight / 2;
self.timerCallback();
}, false);
},

初始化Chroma-key

首先,我们要搞定下Chroma-key在加载阶段的准备工作,就在doLoad()这个方法里头。先得定位下XHTML文件里面的视频和那俩canvas元素在哪儿,瞅瞅他们上面画的是啥,坐标信息都记住哈。然后,给那个video元素加上个eventListener,一旦用户点击了”play”信号就能马上开始工作

timerCallback: function() {
if (this.video.paused || this.video.ended) {
return;
}
this.computeFrame();
let self = this;
setTimeout(function () {
self.timerCallback();
}, 0);
},

定时器回调

下次记得我们得一起搞定那个定时器回调函数里的图片帧。等视频开始放了,这个函数就能按照一定的速度把每幅画面加个很炫的Chroma-keying特效!开始之前,回调函数得判断一下是不是真的开始播放了;接着,要用到computeFrame()方法处理你现在看到的这张图;最后,用setTimeout()让它自动定期运行这些操作。

处理视频帧数据

computeFrame: function() {
this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
let frame = this.ctx1.getImageData(0, 0, this.width, this.height);
let l = frame.data.length / 4;
for (let i = 0; i  100 && r > 100 && b < 43)
frame.data[i * 4 + 3] = 0;
}
this.ctx2.putImageData(frame, 0, 0);
return;
}

这个神奇的方法叫Chromakey(调色)效果,可以把每一帧都记录起来,做出我们想要的效果。首先,要用canvasctx1画一幅缩小的图片,尺寸只有原来的一半。然后,掏出 getImageData()这个小助手,查看一下现在的画面截图中有多少个像素。最后,那就一个个地数这些像素,只要发现背景色和我们设定的背景图里的颜色相同,那么背景就可以变得透明!

搞定了,就是这样简单搞一下,每一帧都变成色度抠像的~其实这种技术对于做视频,还有造虚拟场景都挺有用的,看起来真实又有趣!

XHTML弄出Chroma-keying效果,化身虚拟场景

老铁们学学HTML5和Canvas,没事常逛技术网站留意下,保证你们学得停不下来,收获超多实用新技能!

原文链接:https://www.icz.com/technicalinformation/web/2024/04/15385.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?