我们知道了如何使用WebRTC打开摄像头,可以截取视频帧并且用canvas显示出来。

本文将滤镜与视频结合。给视频加上一层滤镜。主要使用到的是filter属性。

canvas与滤镜

先来看filter与canvas的使用。先把canvas放好,显示一张本地的图片。

<canvas id="sample-canvas" style="width: 358px;height: 100%;"></canvas>

Image把图片读进来,然后给canvas来显示。为了演示方便,canvas的宽高和图片宽高是一致的。

const sampleCanvas = document.querySelector('#sample-canvas');
var img = new Image();
img.src = 'webrtc-fish.png'; // rustfisher.com pic
img.onload = function () {
sampleCanvas.getContext('2d').drawImage(img, 0, 0, sampleCanvas.width, sampleCanvas.height);
}

slider

Android中有SeekBar。在这里我们需要自定义一个slider。这里也可以根据实际需求,或者使用已有的滑动选择器。

/* 选择进度 */
.slider-container {
width: 100%;
display: flex;
justify-content: left;
align-items: center;
} /* 滑动选择器 */
.slider {
-webkit-appearance: none;
appearance: none;
width: 80%;
height: 100%;
background: #d3d3d3;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
} .slider:hover {
opacity: 1;
} .slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 20px;
height: 20px;
background: #0c23f7;
cursor: pointer;
} .slider::-moz-range-thumb {
width: 20px;
height: 20px;
background: #044caa;
cursor: pointer;
}

定义几种滤镜,准备使用。

  • Blur 效果是糊化
  • Grayscale 效果是灰度
  • Invert 效果是反转
  • Sepia 效果是深褐色
<select id="filter">
<option value="none">None</option>
<option value="blur">Blur</option>
<option value="grayscale">Grayscale</option>
<option value="invert">Invert</option>
<option value="sepia">Sepia</option>
</select>
<div class="slider-container">
<p id="slide-value" style="width: 10%; height: 100%;"></p>
<input type="range" min="1" max="100" value="10" class="slider" id="myRange">
</div>

选择器用了input元素,数值范围1~100。

canvas+filter

使用滤镜时,需要改变元素style的filter值。

blur的单位是px。其它可以使用%。把种类和数值拼接成字符串,作为filter的值。

const filterSelect = document.querySelector('select#filter');
filterSelect.onchange = function () {
changeFilter();
}; // 改变滤镜的值
function changeFilter() {
var filterValue = "" + filterSelect.value + "(" + slider.value + "%)";
if (filterSelect.value == "blur") {
filterValue = "" + filterSelect.value + "(" + slider.value + "px)";
} else if (filterSelect.value == "none") {
filterValue = "";
}
sampleCanvas.style.filter = filterValue; // 图片的滤镜
} slider.oninput = function () {
sliderValue.innerHTML = this.value;
changeFilter();
}

不同的效果预览如下

效果名 示例图
原图
blur
gray
invert
sepia

调整进度选择数值,可以得到看到效果加强/减弱的样子。

结合视频

有了上面的尝试,我们可以把filter加到video上试试。

首先还是引入webrtc的adapter。

<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

网络不好的同学,也可以下载这个文件放在你的本地服务器上。比如

<script src="../js/adapter-latest.js" async></script>

放置video,button和canvas。video预览摄像头,canvas用来显示截取的图像。

<video playsinline autoplay></video>
<button id="start">打开摄像头</button>
<button id="snapshot">截取</button>
<canvas id="main"></canvas>

和前面的两篇文章类似,先来打开摄像头,然后把摄像头的流交给video

const snapshotButton = document.querySelector('button#snapshot');
const video = window.video = document.querySelector('video');
const canvas = window.canvas = document.querySelector('canvas#main');
canvas.width = 480;
canvas.height = 360; function startVideo() {
navigator.mediaDevices.getUserMedia(constraints).then(gotStream).catch(onError);
} function gotStream(stream) {
window.stream = stream;
video.srcObject = stream;
}

允许浏览器使用摄像头(mac可能还需要多允许一次权限)。

这次我们要更改video的filter。改变滤镜的种类时,把滤镜设置给canvas和video的style。

function changeFilter() {
var filterValue = "" + filterSelect.value + "(" + slider.value + "%)";
if (filterSelect.value == "blur") {
filterValue = "" + filterSelect.value + "(" + slider.value + "px)";
} else if (filterSelect.value == "none") {
filterValue = "";
}
sampleCanvas.style.filter = filterValue; // 图片的滤镜
canvas.style.filter = filterValue; // 图片的滤镜
video.style.filter = filterValue; // 视频预览的滤镜
}

值得注意的是,我们的滤镜是加在元素上的,并没有影响视频和图片。也就是说这是个附加的效果。

小结

本文将css滤镜的效果应用在video和canvas上。给视频和图片增加了丰富的效果。

预览

完整预览请参考 webrtc与css滤镜示例

原文链接

最新文章

  1. 最好用的JQuery插件集合以及组合拳
  2. fatal error C1061: 编译器限制 : 块嵌套太深
  3. Saltstack
  4. 《机器学习实战》 code debug
  5. 造成OOM(内存溢出)的几种情况
  6. 2016HUAS暑假集训训练题 G - Oil Deposits
  7. 【hibernate】&lt;第二节&gt;hibernate的一对多映射(基本类型)
  8. PHP 加密 和 解密 方法
  9. 1025: [SCOI2009]游戏 - BZOJ
  10. 【ASP.NET Web API教程】2.3 与实体框架一起使用Web API
  11. [笔记]A*寻路算法初探
  12. JAVA通过I/O流复制文件
  13. 201521123063 《Java程序设计》 第9周学习总结
  14. .net core 开发短网址平台的思路
  15. 安装scrapy框架的常见问题及其解决方法
  16. ext window嵌jsp页面自适应
  17. python之路day06--python2/3小区别,小数据池的概念,编码的进阶str转为bytes类型,编码和解码
  18. GitHub下载提速
  19. 高级组件——弹出式菜单JPopupMenu
  20. cyberduck的SSH登录

热门文章

  1. Java(17)面向对象之多态
  2. MC-BE基岩版服务器搭建与日常维护
  3. Vue Router 常见问题(push报错、push重复路由刷新)
  4. Endian
  5. 异构智联Wi-Fi+蓝牙模组,连接快、准、稳!
  6. Java中的函数式编程(四)方法引用method reference
  7. 字符串折叠&amp;压缩(区间DP)
  8. mysql数据库导入导出文件sql文件
  9. C语言图书管理借阅系统——ncurses库的使用
  10. GitHub上 README 增加图片标签