写点什么

web 技术分享| css filter 和 getUserMedia 的联合使用

作者:anyRTC开发者
  • 2022 年 1 月 04 日
  • 本文字数:1530 字

    阅读完需:约 5 分钟

设置 CSS3 filter(滤镜) 属性

  • filter 属性定义了元素(通常是<img>)的可视效果(例如:模糊与饱和度)。

  • blur(px) 给图像设置高斯模糊。"radius"一值设定高斯函数的标准差,或者是屏幕上以多少像素融在一起, 所以值越大越模糊;

  • grayscale(%) 将图像转换为灰度图像。值定义转换的比例。值为 100%则完全转为灰度图像,值为 0%图像无变化。值在 0%到 100%之间,则是效果的线性乘子。若未设置,值默认是 0;

  • invert(%) 反转输入图像。值定义转换的比例。100%的价值是完全反转。值为 0%则图像无变化。值在 0%和 100%之间,则是效果的线性乘子。 若值未设置,值默认是 0。

  • sepia(%) 将图像转换为深褐色。值定义转换的比例。值为 100%则完全是深褐色的,值为 0%图像无变化。值在 0%到 100%之间,则是效果的线性乘子。若未设置,值默认是 0;


.none {    -webkit-filter: none;    filter: none;}
.blur { -webkit-filter: blur(3px); filter: blur(3px);}
.grayscale { -webkit-filter: grayscale(1); filter: grayscale(1);}
.invert { -webkit-filter: invert(1); filter: invert(1);}
.sepia { -webkit-filter: sepia(1); filter: sepia(1);}
button#snapshot { margin: 0 10px 25px 0; width: 110px;}
video { object-fit: cover;}
复制代码

获取元素

  • Document方法querySelector(), 返回Element文档中与指定选择器或选择器组匹配的第一个。如果未找到匹配项,null则返回。

  • 匹配是使用文档节点的深度优先预序遍历完成的,从文档标记中的第一个元素开始,并按子节点数量的顺序迭代顺序节点。


const filterSelect = document.querySelector('select#filter');const video = window.video = document.querySelector('video');
复制代码

绑定 change 事件

  • 当元素的值发生改变时,会发生 onchange 事件。

  • 该事件类似于 oninput 事件。不同之处在于 oninput 事件在元素值改变后立即发生,而 onchange 在元素失去焦点而内容发生改变后发生。另一个区别是 onchange 事件也适用于 <select> 元素。


filterSelect.onchange = function() {  video.className = filterSelect.value;};
复制代码

获取音视频轨道

  • MediaDevices.getUserMedia() 会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D 转换器等等),也可能是其它轨道类型。

  • 它返回一个 Promise对象,成功后会resolve回调一个 MediaStream 对象。若用户拒绝了使用权限,或者需要的媒体源不可用,promisereject回调一个 PermissionDeniedError 或者 NotFoundError


navigator.mediaDevices.getUserMedia({    audio: false,    video: true}).then(handleSuccess).catch(handleError);
function handleSuccess(stream) { video.srcObject = stream;}
function handleError(error) { console.log('navigator.MediaDevices.getUserMedia error: ', error.message, error.name);}
复制代码

HTML

<!DOCTYPE html><html><head>    <meta charset="utf-8">    <link rel="stylesheet" href="./index.css"></head>
<body><video playsinline autoplay></video><label for="filter">Filter: </label><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>
<script src="./index.js"></script></body></html>
复制代码

效果展示






发布于: 4 小时前
用户头像

实时交互,万物互联! 2020.08.10 加入

实时交互,万物互联,全球实时互动云服务商领跑者!

评论

发布
暂无评论
web技术分享| css filter和getUserMedia的联合使用