动图
canvas的drawImage()方法很强大,第一个参数可以是图片,可以是canvas,还可以是video。做动图主要是用到它的裁剪效果,也就是传参的不同,裁剪效果有9个参数,drawImage(原图,从原图哪里开始裁剪x坐标,y坐标,裁剪宽度,裁剪高度,从画布哪里开始画x坐标,y坐标,缩放宽度(对比裁剪宽高),缩放高度)
实现代码
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = './images/tmac_gif.gif';
img.onload = function(){
var i = 0;
setInterval(function(){
i++;
i = i%13;
//裁剪图片(源,从原图哪里开始裁剪x坐标,y坐标,要裁剪宽度,高度,在画布上开始x坐标,y坐标,裁剪后缩放对比裁剪的宽高)
ctx.drawImage(img, 241*i, 0, 241, 150, 200, 100, 241, 150);
}, 160)
}
效果
操作视频
这里主要有两点
1、用requestAnimationFrame()制作动画,浏览器会自动判断请求一帧,而不需要想定时器那样手动设置时间间隔。
2、getImageData()获取当前图像像素信息,其中data属性是一个每个像素点的rgba数值数组集合,比如该图像有两个像素且都是黑色的,那getImageData().data就是[0, 0, 0, 255, 0, 0, 0, 255]。
下面简单实现一下将视频变成黑白
var canvas = document.getElementById('canvas');
var video = document.querySelector('video');
var playPause = document.querySelector('.play-pause');
var ctx = canvas.getContext('2d');
playPause.onclick = function(){
// console.log(video.paused);
if(video.paused){ //当前视频暂停
video.play();
this.innerHTML = '暂停';
}else{
video.pause();
this.innerHTML = '播放';
}
}
function next(){
//向浏览器请求一帧
requestAnimationFrame(function(){
//绘图
ctx.drawImage(video, 0, 0);
//获取画面像素信息,得到一个每个像素点的rgba值得数组,需要运行在服务端
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
var data = imgData.data;
// console.log(imgData);
for(var h=0; h<canvas.height; h++){ //canvas高
for(var w=0; w<canvas.width; w++){ //canvas宽
//每个像素rgb的平均值
var avg = Math.floor((data[(h*canvas.width+w)*4]+data[(h*canvas.width+w)*4+1]+data[(h*canvas.width+w)*4+2])/3);
//每个像素的rgb值都设为平均值,达到中间灰效果
data[(h*canvas.width+w)*4]=data[(h*canvas.width+w)*4+1]=data[(h*canvas.width+w)*4+2] = avg;
}
}
//将修改后的像素信息放回去
ctx.putImageData(imgData, 0, 0);
next();
})
}
next();
效果