当前位置: 首页 > news >正文

使用 Canvas 绘制一个镂空的圆形区域

如果要实现一个类似人脸识别的界面,要求使用 canvas 进行绘制,中间镂空透明区域,背景是白色的画布。

技术方案:

  1. 首先,使用 canvas 绘制一个白色画布
  2. 其次,使用 context.globalCompositeOperation 合成属性进行多图层处理

UI 绘制

<section><video id="video-preview" width="0%" height="0%" autoPlay /><div><canvas id="video-canvas" width="300" height="300" /></div><button id="start-recording">start</button><button id="stop-recording" disabled>stop</button>
</section>

逻辑实现(纯js实现)

// 获取 DOM 元素
const video: any = document.getElementById('video-preview');const canvas: any = document.getElementById('video-canvas');
const ctx = canvas.getContext('2d');// 设定遮罩区域的尺寸
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
const outerRadius = Math.min(centerX, centerY) * 0.9;// 绘制视频帧
function drawFrame() {// 绘制 Video 流ctx.drawImage(video, 0, 0, canvas.width, canvas.height);ctx.beginPath();ctx.arc(centerX, centerY, outerRadius, 0, 2 * Math.PI);ctx.globalCompositeOperation = 'destination-in'; // 使用复合操作使颜色变为透明ctx.fill();// 恢复默认的混合模式ctx.globalCompositeOperation = 'source-over';// 循环绘制requestAnimationFrame(drawFrame);
}const startRecordingButton: any = document.getElementById('start-recording');
const stopRecordingButton: any = document.getElementById('stop-recording');// 录制状态标志
let isRecording: any = false;
let recordedBlobs: any = [];
let mediaRecorder: any = null;
let stream: any = null;// 请求访问媒体设备
navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then((_stream) => {stream = _stream;video.srcObject = stream; // 设置视频源}).catch((err) => console.error('Error:', err));// 等待视频流就绪
video.addEventListener('canplay', () => {drawFrame();
});
// 开始录制按钮点击事件处理函数
startRecordingButton.addEventListener('click', () => {if (!isRecording) {isRecording = true;startRecordingButton.disabled = true;stopRecordingButton.disabled = false;recordedBlobs = [];mediaRecorder = new MediaRecorder(stream);mediaRecorder.ondataavailable = (event) => {if (event.data && event.data.size > 0) {recordedBlobs.push(event.data);}};mediaRecorder.onstop = () => {// 录制结束后,合并 Blobconst blob = new Blob(recordedBlobs, { type: 'video/mp4' });const url = URL.createObjectURL(blob);const a = document.createElement('a');document.body.appendChild(a);a.style.display = 'none';a.href = url;a.download = 'recorded-video.mp4';a.click();window.URL.revokeObjectURL(url);};mediaRecorder.start();}
});// 停止录制按钮点击事件处理函数
stopRecordingButton.addEventListener('click', () => {if (isRecording) {mediaRecorder.stop();isRecording = false;startRecordingButton.disabled = false;stopRecordingButton.disabled = true;}
});

在线查看

点击查看

相关文章:

使用 Canvas 绘制一个镂空的圆形区域

如果要实现一个类似人脸识别的界面&#xff0c;要求使用 canvas 进行绘制&#xff0c;中间镂空透明区域&#xff0c;背景是白色的画布。 技术方案&#xff1a; 首先&#xff0c;使用 canvas 绘制一个白色画布其次&#xff0c;使用 context.globalCompositeOperation 合成属性进…...

【Notepad++】---设置背景为护眼色(豆沙绿)最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Notepad】---设置背景为护眼色&#xf…...

2024 数学建模国一经验分享

2024 数学建模国一经验分享 背景&#xff1a;武汉某211&#xff0c;专业&#xff1a;计算机科学 心血来潮&#xff0c;就从学习和组队两个方面指点下后来者&#xff0c;帮新人避坑吧 2024年我在数学建模比赛中获得了国一&#xff08;教练说论文的分数是湖北省B组第一&#xff0…...

安全见闻2

安全见闻&#xff0c;犹如一座庞大而深邃的知识宝库&#xff0c;其中涵盖了形形色色的网络安全知识与错综复杂的网络技术体系。在当今数字化时代&#xff0c;这些领域的重要性不言而喻&#xff0c;它们不仅关乎个人信息的保护与隐私安全&#xff0c;更是支撑着整个互联网世界以…...

Web游戏开发指南:在 Phaser.js 中读取和管理游戏手柄输入

前言 Phaser.js 是一个广受欢迎的 HTML5 游戏框架&#xff0c;为开发者提供了创建跨平台 2D 游戏的强大工具。在现代游戏开发中&#xff0c;支持游戏手柄已成为提升玩家体验的重要方面。本文将详细介绍如何在 Phaser.js 中监听和处理游戏手柄的输入&#xff0c;帮助开发者为他…...

代码随想录32 动态规划理论基础,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯。

1.动态规划理论基础 动态规划刷题大纲 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的…...

记录一个Flutter 3.24单元测试点击事件bug

哈喽&#xff0c;我是老刘 这两天发现一个Flutter 3.24版本的单元测试的一个小bug&#xff0c;提醒大家注意一下。 老刘自己写代码十多年了&#xff0c;写Flutter也6年多了&#xff0c;没想到前两天在一个小小的BottomNavigationBar 组件上翻了车。 给大家分享一下事件的经过。…...

使用Python将 word文档转pdf文档

第一步&#xff1a;我们需要导入支持包 >pip install pywin32 如果下载速度比较慢的话&#xff0c;可以考虑使用国内镜像源。 第二步&#xff1a;我们需要导入文件&#xff0c;这里采用 input,用户填入路径后&#xff0c;直接获取路径下的word文档&#xff0c;实现批量转换…...

基于C#+SQLite开发数据库应用的示例

SQLite数据库&#xff0c;小巧但功能强大&#xff1b;并且是基于文件型的数据库&#xff0c;驱动库就是一个dll文件&#xff0c;有些开发工具 甚至不需要带这个dll&#xff0c;比如用Delphi开发&#xff0c;用一些三方组件&#xff1b;数据库也是一个文件&#xff0c;虽然是个文…...

Vue基本语法

Options API 选项式/配置式api 需要在script中的export default一个对象对象中可以包含data、method、components等keydata是数据&#xff0c;数据必须是一个方法&#xff08;如果是对象&#xff0c;会导致多组件的时候&#xff0c;数据互相影响&#xff0c;因为对象赋值后&…...

芯片发展史

芯片的发展史可分为几个重要的阶段&#xff0c;从早期的真空管到现代的集成电路&#xff0c;反映了技术进步和创新的历程&#xff1a; 1. 真空管时代 (1904 - 1950年代) 真空管是20世纪初的电子元件&#xff0c;用于放大信号和开关&#xff0c;广泛应用在早期的收音机、电视机…...

我的知识图谱和Neo4j数据库的使用

知识图谱概述 知识图谱的含义 RDF与RDFS RDF&#xff08;Resource Description Framework&#xff0c;资源描述框架&#xff09;和RDFS&#xff08;RDF Schema&#xff0c;RDF模式&#xff09;是构建知识图谱的基础技术之一。它们提供了一种标准的方式来表示信息&#xff0c;…...

ASP.NET CORE API 解决跨域问题

环境 vs2022 .net 8 创建ASP.net Core API项目 配置跨域 编写ApiController 启动项目 得到服务器运行的 地址 在Hbuiler中创建web项目&#xff0c;编写代码 【运行】-【运行到浏览器】-选择一个浏览器,查看结果 正常显示 问题 如果允许所有源访问&#xff0c;有安全风险方…...

sram测试注意讨论

常规测试首先是mbist测试&#xff0c;原理不用多说&#xff0c;自己看&#xff0c;主要是注意点和考虑点&#xff1a; 1、明确测试用的到func_clk的频率的大小&#xff0c;根据经验值一般大于800M的时钟需要特别考虑Timing的问题&#xff1a;由于pr摆放的位置原因&#xff0c;…...

Mybatis 支持延迟加载的详细内容

延迟加载的概念深入 延迟加载是一种在处理复杂对象关系时非常有用的策略。在企业级应用开发中&#xff0c;数据库中的表之间往往存在着各种关联关系&#xff0c;如一对多&#xff08;一个用户有多个订单&#xff09;、多对多&#xff08;一个学生可以选多门课程&#xff0c;一门…...

word文档使用技巧笔记

中文和数字断开到第二行 word一串数字断开_百度知道 下划线对齐 word下划线怎么固定长度一致-百度经验...

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索&#xff0c;并提供了强大的聚合功能&#xff0c;可以处理大规模的数据集并进行快速…...

bugku-web-login2

不知道为啥用bp始终登不上hackbar可以 随便输入个账号密码bp抓包&#xff0c;发现个小tip是base64加密的解密 $sql"SELECT username,password FROM admin WHERE username".$username.""; if (!empty($row) && $row[password]md5($password)){ } …...

【 AI技术赋能有限元分析与材料科学应用实践】Neo-Hookean 材料与深度学习结合的有限元分析

Neo-Hookean 材料模型是用于描述非线性弹性材料&#xff08;如软组织和橡胶等&#xff09;的经典模型&#xff0c;特别适用于大变形问题。其基本思想是通过应变能密度函数来描述材料的弹性行为。在该模型中&#xff0c;材料的应力-应变关系不仅依赖于应变能&#xff0c;还通过变…...

StarRocks关于ConcurrentModificationException 问题的解决

背景 本文基于 StarRocks 3.1.7 目前在基于Starrocks做一些数据分析的操作(主要是做一些简单的查询)&#xff0c;同事遇到了一些并发的问题: ontent:2024-11-27 07:04:34,048 WARN (starrocks-mysql-nio-pool-214933|3593819) [StmtExecutor.execute():643] execute Exceptio…...

告别claude code封号烦恼使用taotoken稳定密钥与聚合接口的配置指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 告别Claude Code封号烦恼使用Taotoken稳定密钥与聚合接口的配置指南 对于依赖Claude Code进行编程辅助的开发者而言&#xff0c;直…...

KaTrain终极指南:用AI围棋教练快速提升你的棋艺水平

KaTrain终极指南&#xff1a;用AI围棋教练快速提升你的棋艺水平 【免费下载链接】katrain Improve your Baduk skills by training with KataGo! 项目地址: https://gitcode.com/gh_mirrors/ka/katrain 你是否曾经在对局后感到困惑&#xff0c;不知道自己的失误究竟在哪…...

快速上手Notepad2-mod:5个步骤打造你的专属轻量级代码编辑器

快速上手Notepad2-mod&#xff1a;5个步骤打造你的专属轻量级代码编辑器 【免费下载链接】notepad2-mod LOOKING FOR DEVELOPERS - Notepad2-mod, a Notepad2 fork, a fast and light-weight Notepad-like text editor with syntax highlighting 项目地址: https://gitcode.c…...

百度文库文档免费下载终极指南:三步获取PDF完整教程

百度文库文档免费下载终极指南&#xff1a;三步获取PDF完整教程 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 你是否经常在百度文库找到心仪的文档&#xff0c;却因为需要下载券或付费而无法保存…...

ElevenLabs波兰语语音突然失真?3类高频报错代码+实时调试日志解析(含波兰语IPA音素校验表)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ElevenLabs波兰语语音失真现象的系统性定位 ElevenLabs 的 TTS 服务在处理波兰语时&#xff0c;部分用户报告出现音素断裂、重音偏移及辅音簇&#xff08;如 szcz、 żdź&#xff09;发音模糊等失真现象。此…...

STM32F407用HAL库驱动42步进电机,从CubeMX配置到代码调试的完整避坑指南

STM32F407 HAL库驱动42步进电机实战&#xff1a;从CubeMX配置到高效调试的完整指南 第一次用STM32F407的HAL库驱动42步进电机时&#xff0c;我花了整整三天时间才让电机转起来。最让我抓狂的是明明CubeMX配置看起来一切正常&#xff0c;TIM1通道就是死活不出PWM波形。后来才发现…...

ElevenLabs印地文语音质量崩塌真相(印地语TTS失效深度溯源):7类发音错误+5个未公开参数修复方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs印地文语音质量崩塌的全局现象与影响评估 近期&#xff0c;ElevenLabs平台在印地语&#xff08;Hindi&#xff09;TTS合成任务中出现系统性语音质量退化&#xff0c;表现为音素错读、韵律断裂…...

ChromeKeePass终极指南:如何在Chrome浏览器中实现KeePass密码自动填充

ChromeKeePass终极指南&#xff1a;如何在Chrome浏览器中实现KeePass密码自动填充 【免费下载链接】ChromeKeePass Chrome extensions for automatically filling credentials from KeePass 项目地址: https://gitcode.com/gh_mirrors/ch/ChromeKeePass ChromeKeePass是…...

【蒸汽波风格工业化生产标准】:基于1372张MJ出图数据建模,定义饱和度/噪点/复古失真三维黄金阈值

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;蒸汽波美学的数字解构与范式迁移 蒸汽波&#xff08;Vaporwave&#xff09;并非仅是一种视觉风格或音乐流派&#xff0c;而是一场对晚期资本主义数字界面的戏仿性考古——它通过降速采样、CRT扫描线模拟、80年…...

酷安UWP桌面客户端:在Windows电脑上高效刷酷安的完整指南

酷安UWP桌面客户端&#xff1a;在Windows电脑上高效刷酷安的完整指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 还在为手机小屏幕刷酷安而感到眼睛酸痛吗&#xff1f;想在27寸大屏幕…...