javascript - 从视频帧在 Canvas 中绘制图像改变色调

标签 javascript html5-canvas html5-video drawimage

我写了一个简单的脚本,从视频中提取一帧并将其绘制到 Canvas 上。我的问题是视频和绘制图像之间的颜色在变化。

我将结果放在原始结果旁边,以便于查看。原来的在左边。顺便说一句,它在 chrome 浏览器上似乎更明显。我在 OSX 上进行的所有测试。

这里是一个片段,左边是 Canvas ,右边是视频:

 // Get our mask image
var canvas = document.querySelector(".canvas");
var video = document.querySelector(".video");

var ctx = canvas.getContext('2d');
function drawMaskedVideo() {
  ctx.drawImage(video, 0, 0, video.videoWidth/2, video.videoHeight, 0,0, video.videoWidth/2,  video.videoHeight);
}

requestAnimationFrame(function loop() {
  drawMaskedVideo();
  requestAnimationFrame(loop.bind(this));
});
html, body {
  margin: 0 auto;
}
.video, .canvas {
  width: 100%;
}

.canvas {
  position: absolute;
  top: 0;
  left: 0;
}
<video class="video" autoplay="autoplay" muted="muted" preload="auto" loop="loop">
    <source src="http://mazwai.com/system/posts/videos/000/000/214/original/finn-karstens_winter-wonderland-kiel.mp4" type="video/mp4">
</video>
<canvas class='canvas' width='1280' height='720'></canvas>

我想知道为什么会发生这种情况,是否有可能以跨浏览器的方式摆脱它?

enter image description here

这里是我写的简单脚本:

let video = document.querySelector('#my-video') // .mp4 file used
let w = video.videoWidth;
let h = video.videoHeight;
let canvas = document.createElement('canvas');
    canvas.width  = w;
    canvas.height = h;
let ctx = canvas.getContext('2d');

ctx.drawImage(video, 0, 0, w, h)

document.querySelector('.canvas-container').appendChild(canvas);

最佳答案

解决方案可能就像为视频元素设置一个 css filter 一样简单:

.video {
    -webkit-filter: contrast(100%);
}

我无法对此进行推理,因为它是偶然发现的(玩你的演示并阅读相关答案),所以我把技术解释留给其他人,现在留给你一些魔法。

Any sufficiently advanced technology is indistinguishable from magic.

— Arthur C. Clarke

 // Get our mask image
var canvas = document.querySelector(".canvas");
var video = document.querySelector(".video");

var ctx = canvas.getContext('2d');
function drawMaskedVideo() {
  ctx.drawImage(video, 0, 0, video.videoWidth/2, video.videoHeight, 0,0, video.videoWidth/2,  video.videoHeight);
}

requestAnimationFrame(function loop() {
  drawMaskedVideo();
  requestAnimationFrame(loop.bind(this));
});
html, body {
  margin: 0 auto;
}
.video, .canvas {
  width: 100%;
}
.video {
  -webkit-filter: contrast(100%);
}

.canvas {
  position: absolute;
  top: 0;
  left: 0;
}
<video class="video" autoplay="autoplay" muted="muted" preload="auto" loop="loop">
    <source src="http://mazwai.com/system/posts/videos/000/000/214/original/finn-karstens_winter-wonderland-kiel.mp4" type="video/mp4">
</video>
<canvas class='canvas' width='1280' height='720'></canvas>


注意: 在 Macbook Pro(2.3 GHz Intel Core i5)上运行它,我看不出性能有什么不同。在视频播放期间跟踪 CPU,两个演示都空闲在 28% 左右。

关于javascript - 从视频帧在 Canvas 中绘制图像改变色调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45884058/

相关文章:

Android HTML5 视频离线缓存

javascript - 单页应用程序( Angular )中页面上的许多视频标签导致页面卡住

javascript - 如何在字符串中找到时间戳,然后转换为小时/分钟数?

javascript - 滚动时触发 setTimeout

javascript - Fabric.js - 如何从 Sprite 表制作动画

javascript - 如何在 HTML Canvas 上绘制可变粗细的贝塞尔曲线?

javascript - 如何使用canvas和javascript对图像进行像素化

javascript - 是否可以使用 WebRTC getusermedia 和 HTML5 访问整个屏幕?

javascript - 无法在多个 window.print() 中加载图像

javascript - 获取矩阵的值