通过webrtc+canvas+css实现简单的电脑滤镜拍照效果

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

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

代码:

HTML:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>webrtc实现拍照和滤镜</title><link rel="stylesheet" href="./index.css">
</head>
<body><div id="container" style="width: fit-content;height: fit-content;position: relative;"><video id="video" src=""></video><div id="filter" class="filter"></div></div><select id="select"><option value="">无滤镜</option><option value="style1">滤镜1</option><option value="style2">滤镜2</option><option value="style3">滤镜3</option></select><h3>截图展示</h3><button id="snap">截图</button>
</body>
<script src="./index.js"></script>
</html>

 js:


//获取视频流const constraints = {video: {width: { min: 300, ideal: 600, max: 900 },height: { min: 300, ideal: 600, max: 900 },frameRate: { ideal: 60, max: 120 }, //帧率}
}navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {const video = document.querySelector('video')video.srcObject = stream;video.onloadedmetadata = function (e) {video.play();}}).catch(function (err) {console.log("启动失败", err)})//设置视频流滤镜
const video = document.querySelector('.filter')
const selectVal = document.querySelector('#select')
selectVal.addEventListener('change', () => {video.className = 'filter' // 清空之前的类名if (selectVal.value) {video.classList.add(selectVal.value) // 添加新的类名}
})const snapButton = document.querySelector('#snap');
snapButton.addEventListener('click', () => {const canvas = document.createElement('canvas')const video = document.getElementById('video');const filterDiv = document.getElementById('filter');console.log(video,filterDiv)const ctx = canvas.getContext('2d');// 设置 Canvas 的宽高与容器相同const container = document.getElementById('container');canvas.width = container.offsetWidth;canvas.height = container.offsetHeight;// 绘制视频的当前帧ctx.drawImage(video, 0, 0, canvas.width, canvas.height);// 绘制滤镜层ctx.fillStyle = window.getComputedStyle(filterDiv).backgroundColor;ctx.fillRect(0, 0, canvas.width, canvas.height);// 导出图像并显示const imgData = canvas.toDataURL('image/png');const img = document.createElement('img');img.src = imgData;document.body.appendChild(img);
})

这里注意: 报错为OverconstrainedError时,看一下自己分辨率是否过大

css:

:root {--back-style: unset;
}.filter {content: '';position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: var(--back-style);z-index: 2;pointer-events: none;
}.style1 {--back-style: rgba(0, 0, 0, 0.2);
}.style2 {--back-style: rgba(255, 255, 255, 0.2);
}.style3 {--back-style: rgba(0, 0, 255, 0.2);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《TCP/IP网络编程》学习笔记 | Chapter 20:Windows 中的线程同步

《TCP/IP网络编程》学习笔记 | Chapter 20&#xff1a;Windows 中的线程同步 《TCP/IP网络编程》学习笔记 | Chapter 20&#xff1a;Windows 中的线程同步用户模式和内核模式用户模式同步内核模式同步 基于 CRITICAL_SECTION 的同步内核模式的同步方法基于互斥量对象的同步基于…

VBA-Excel

VBA 一、数据类型与变量 常用数据类型&#xff1a; Byte&#xff1a;字节型&#xff0c;0~255。Integer&#xff1a;整数型&#xff0c;用于存储整数值&#xff0c;范围 -32768 到 32767。Long&#xff1a;长整型&#xff0c;可存储更大范围的整数&#xff0c;范围 -214748364…

kotlin 内联函数 inline

高阶函数实现的原理&#xff1a;函数类型其实是生成了一个对象 。 inline翻译成中文的意思就是内联&#xff0c;在kotlin里面inline被用来修饰函数&#xff0c;表明当前函数在编译时是以内嵌的形式进行编译的&#xff0c;从而减少了一层函数调用栈&#xff1a; inline fun fun…

PairRE: Knowledge Graph Embeddings via Paired Relation Vectors(论文笔记)

CCF等级&#xff1a;A 发布时间&#xff1a;2020年11月 25年3月24日交 目录 一、简介 二、原理 1.整体 2.关系模式 3.优化模型 三、实验性能 四、结论和未来工作 一、简介 将RotatE进行生级&#xff0c;RotatE只对头实体h进行计算&#xff0c;PairRE对头尾实体都进行…

从报错到成功:Mermaid 流程图语法避坑指南✨

&#x1f680; 从报错到成功&#xff1a;Mermaid 流程图语法避坑指南 &#x1f680; &#x1f6a8; 问题背景 在开发文档或技术博客中&#xff0c;我们经常使用 Mermaid 流程图 来可视化代码逻辑。但最近我在尝试绘制一个 Java Stream 转换流程图时&#xff0c;遭遇了以下报错…

深入解析 Redis 实现分布式锁的最佳实践

前言 在分布式系统中&#xff0c;多个进程或线程可能会同时访问同一个共享资源&#xff0c;这就可能导致数据不一致的问题。为了保证数据的一致性&#xff0c;我们通常需要使用分布式锁。Redis 作为高性能的内存数据库&#xff0c;提供了一种简单高效的方式来实现分布式锁。本…

2025年03月10日人慧前端面试(外包滴滴)

目录 普通函数和箭头函数的区别loader 和 plugin 的区别webpack 怎么实现分包&#xff0c;为什么要分包webpack 的构建流程变量提升react 开发中遇到过什么问题什么是闭包vue 开发中遇到过什么问题vue中的 dep 和 watcher 的依赖收集是什么阶段什么是原型链react setState 是同…

Android10 系统截屏功能异常的处理

客户反馈的问题&#xff0c;设备上使用状态栏中“长截屏”功能&#xff0c;截屏失败且出现系统卡死问题。 在此记录该问题的处理 一现象&#xff1a; 设备A10上使用系统“长截屏”功能&#xff0c;出现截屏失败&#xff0c;系统死机。 二复现问题并分析 使用设备操作该功能&…

openvela新时代的国产开源RTOS系统

openvela 简介 openvela 操作系统专为 AIoT 领域量身定制&#xff0c;以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势&#xff0c;已成为众多物联网设备和 AI 硬件的技术首选&#xff0c;涵盖了智能手表、运动手环、智能音箱、耳机、智能家…

ENSP学习day9

ACL访问控制列表实验 ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种用于控制用户或系统对资源&#xff08;如文件、文件夹、网络等&#xff09;访问权限的机制。通过ACL&#xff0c;系统管理员可以定义哪些用户或系统可以访问特定资源&#x…

JVM的组成--运行时数据区

JVM的组成 1、类加载器&#xff08;ClassLoader&#xff09; 类加载器负责将字节码文件从文件系统中加载到JVM中&#xff0c;分为&#xff1a;加载、链接&#xff08;验证、准备、解析&#xff09;、和初始化三个阶段 2、运行时数据区 运行时数据区包括&#xff1a;程序计数…

RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”与“陷阱”

嘿&#xff0c;亲爱的算法工程师们&#xff01;今天咱们聊一聊PDF解析的那些事儿&#xff0c;简直就像是在玩一场“信息捉迷藏”游戏&#xff01;PDF文档就像是个调皮的小精灵&#xff0c;表面上看起来规规矩矩&#xff0c;但当你想要从它那里提取信息时&#xff0c;它就开始跟…

Python网络编程入门

一.Socket 简称套接字&#xff0c;是进程之间通信的一个工具&#xff0c;好比现实生活中的插座&#xff0c;所有的家用电器要想工作都是基于插座进行&#xff0c;进程之间要想进行网络通信需要Socket&#xff0c;Socket好比数据的搬运工~ 2个进程之间通过Socket进行相互通讯&a…

人工智能(AI)系统化学习路线

一、为什么需要系统化学习AI&#xff1f; 人工智能技术正在重塑各行各业&#xff0c;但许多初学者容易陷入误区&#xff1a; ❌ 盲目跟风&#xff1a;直接学习TensorFlow/PyTorch&#xff0c;忽视数学与算法基础。 ❌ 纸上谈兵&#xff1a;只看理论不写代码&#xff0c;无法解…

mac calDAV 日历交互

安装Bakal docker https://sabre.io/dav/building-a-caldav-client/ 在Bakal服务器上注册账户 http://localhost:8080/admin/?/users/calendars/user/1/ 在日历端登录账户&#xff1a; Server: http://127.0.0.1:8080/dav.php Server Path: /dav.php/principals/lion No e…

手机号登录与高并发思考

基础逻辑 一般来说这个验证码登录分为手机号、以及邮箱登录 手机号短信验证&#xff0c;以腾讯云SMS 服务为例&#xff1a; 这个操作无非对后端来说就是两个接口&#xff1a; 一个是获取验证码&#xff0c;这块后端生成6位数字expire_time 去推送到腾讯云sdk &#xff0c;腾…

Python设计模式 - 适配器模式

定义 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它用于将一个类的接口转换为客户端所期待的另一个接口。 注&#xff1a;在适配器模式定义中所提及的接口是指广义的接口&#xff0c;它可以表示一个方法或者一组方法的集合。 结构 …

【前端工程化】

目录 前端工程户核心技术之模块化前端模块化的进化过程commonjs规范介绍commonjs规范示例commonjs模块打包 amd规范、cmd规范前端工程化关键技术之npmwebpack原理 前端工程户核心技术之模块化 前端模块化是一种标准&#xff0c;不是实现。commonjs是前端模块化的标准&#xff…

关于CNN,RNN,GAN,GNN,DQN,Transformer,LSTM,DBN你了解多少

以下是神经网络中常见的几种模型的简要介绍&#xff1a; 1. ​CNN (Convolutional Neural Network, 卷积神经网络) ​用途: 主要用于图像处理和计算机视觉任务。​特点: 通过卷积核提取局部特征&#xff0c;具有平移不变性&#xff0c;能够有效处理高维数据&#xff08;如图像…

T113-i开发板的休眠与RTC定时唤醒指南

​​在嵌入式系统设计中&#xff0c;休眠与唤醒技术是优化电源管理、延长设备续航的关键。飞凌嵌入式基于全志T113-i处理器开发设计的OK113i-S开发板提供了两种休眠模式&#xff1a;freeze和mem&#xff0c;以满足不同应用场景下的功耗与恢复速度需求。本文将详细介绍如何让OK1…