3.7 视频反色
优质
小牛编辑
130浏览
2023-12-01
本节旨在演示如何用跟处理图像差不多的方法,来处理视频的像素。本节,我们将对一小段视频剪辑进行反色处理。
警告:由于getImageData()方法的安全限制,本节的例子必须在Web服务器上运行。
绘制步骤
按照以下步骤,对视频进行反色处理:
1. 创建一个跨浏览器的方法,该方法用来请求动画帧:
window.requestAnimFrame = (function(callback) {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback){
window.setTimeout(callback, 1000 / 60);
};
})();
2. 调用drawFrame()函数来捕获当前视频帧,反转其颜色,再把它绘制到画布。然后,请求一个新的动画帧:
function drawFrame(canvas, context, video) {
context.drawImage(video, 0, 0);
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
var data = imageData.data;
for (var i = 0; i < data.length; i += 4) {
data[i] = 255 - data[i]; // red 红
data[i + 1] = 255 - data[i + 1]; //绿
data[i + 2] = 255 - data[i + 2]; //蓝
// i+3是透明度(第四个元素)
}
// 覆盖源图像
context.putImageData(imageData, 0, 0);
requestAnimFrame(function() {
drawFrame(canvas, context, video);
});
}
3. 定义上下文对象,获取视频标签,并绘制第一个动画帧:
window.onload = function(){
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
var video = document.getElementById("myVideo");
drawFrame(canvas, context, video);
};
4. 在HTML文档的body部分嵌入canvas和video标签:
<video id="myVideo" autoplay="true" loop="true" style="display:none;">
<source src="BigBuckBunny_640x360.ogv" type="video/ogg"/ >
<source src="BigBuckBunny_640x360.mp4" type="video/mp4"/>
</video>
<canvas id="myCanvas" width="640" height="360" style="border:1px solid black;">
</canvas>
工作原理
跟上一节类似,我们可以使用跟处理图像差不多的方法,来处理视频的像素,因为不管上下文是如何被渲染的,getImageData()方法都能从画布上下文对象获取图像数据。本节,我们可以简单地反转画布上由requestAnimFrame()方法提供的每个视频帧的每个像素的颜色。