• WebRTC与CSS滤镜(CSS filter)


    canvas与滤镜

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

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

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

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

    slider

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

    1. /* 选择进度 */
    2. .slider-container {
    3. width: 100%;
    4. display: flex;
    5. justify-content: left;
    6. align-items: center;
    7. }
    8. /* 滑动选择器 */
    9. .slider {
    10. -webkit-appearance: none;
    11. appearance: none;
    12. width: 80%;
    13. height: 100%;
    14. background: #d3d3d3;
    15. outline: none;
    16. opacity: 0.7;
    17. -webkit-transition: .2s;
    18. transition: opacity .2s;
    19. }
    20. .slider:hover {
    21. opacity: 1;
    22. }
    23. .slider::-webkit-slider-thumb {
    24. -webkit-appearance: none;
    25. appearance: none;
    26. width: 20px;
    27. height: 20px;
    28. background: #0c23f7;
    29. cursor: pointer;
    30. }
    31. .slider::-moz-range-thumb {
    32. width: 20px;
    33. height: 20px;
    34. background: #044caa;
    35. cursor: pointer;
    36. }

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

    • Blur 效果是糊化
    • Grayscale 效果是灰度
    • Invert 效果是反转
    • Sepia 效果是深褐色

    1. <select id="filter">
    2. <option value="none">None</option>
    3. <option value="blur">Blur</option>
    4. <option value="grayscale">Grayscale</option>
    5. <option value="invert">Invert</option>
    6. <option value="sepia">Sepia</option>
    7. </select>
    8. <div class="slider-container">
    9. <p id="slide-value" style="width: 10%; height: 100%;"></p>
    10. <input type="range" min="1" max="100" value="10" class="slider" id="myRange">
    11. </div>

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

    文章最后可免费领取,音视频学习资料包

     

    canvas+filter

    使用滤镜时,需要改变元素style的filter值。 blur的单位是px。其它可以使用%。把种类和数值拼接成字符串,作为filter的值。

    1. const filterSelect = document.querySelector('select#filter');
    2. filterSelect.onchange = function () {
    3. changeFilter();
    4. };
    5. // 改变滤镜的值
    6. function changeFilter() {
    7. var filterValue = "" + filterSelect.value + "(" + slider.value + "%)";
    8. if (filterSelect.value == "blur") {
    9. filterValue = "" + filterSelect.value + "(" + slider.value + "px)";
    10. } else if (filterSelect.value == "none") {
    11. filterValue = "";
    12. }
    13. sampleCanvas.style.filter = filterValue; // 图片的滤镜
    14. }
    15. slider.oninput = function () {
    16. sliderValue.innerHTML = this.value;
    17. changeFilter();
    18. }

    不同的效果预览如下

    效果名示例图
    原图

    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用来显示截取的图像。

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

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

    1. const snapshotButton = document.querySelector('button#snapshot');
    2. const video = window.video = document.querySelector('video');
    3. const canvas = window.canvas = document.querySelector('canvas#main');
    4. canvas.width = 480;
    5. canvas.height = 360;
    6. function startVideo() {
    7. navigator.mediaDevices.getUserMedia(constraints).then(gotStream).catch(onError);
    8. }
    9. function gotStream(stream) {
    10. window.stream = stream;
    11. video.srcObject = stream;
    12. }

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

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

    1. function changeFilter() {
    2. var filterValue = "" + filterSelect.value + "(" + slider.value + "%)";
    3. if (filterSelect.value == "blur") {
    4. filterValue = "" + filterSelect.value + "(" + slider.value + "px)";
    5. } else if (filterSelect.value == "none") {
    6. filterValue = "";
    7. }
    8. sampleCanvas.style.filter = filterValue; // 图片的滤镜
    9. canvas.style.filter = filterValue; // 图片的滤镜
    10. video.style.filter = filterValue; // 视频预览的滤镜
    11. }

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

    小结

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

    简易预览

    下面是简易预览。完整预览请参考 webrtc与css滤镜示例

  • 相关阅读:
    SQL语句的常用函数介绍
    4. Python 函数进阶(多返回值、多种传参方式、匿名函数)
    ChatGPT 开源了第一款插件,都来学习一下源码吧!
    17-Spring AOP源码分析-AnnotationAwareAspectJAutoProxyCreator
    计算机毕业设计springboot+vue基本微信小程序的汽车俱乐部系统
    【Matter】解密Matter协议(二)--- 关键概念及特性
    getBoundingClientRect、offset、page、client、screen相关API及释义合集
    GitHub 又爆新作!2 份 PDF+1 个插件算法刷题三件套!面试进阶双飞
    Mybatis—动态SQL
    uni-app - 插件[App云打包]安装失败!(app打包时显示app云打包插件安装失败)解决方案
  • 原文地址:https://blog.csdn.net/yinshipin007/article/details/126432809