html结合js设计一个可拍照可录制可下载的摄像头页面

news/2025/1/10 23:23:41/文章来源:https://www.cnblogs.com/wild-bokeyuan/p/18522306

功能如下

html文件用户设置样式,代码如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Camera App</title>
</head>
<body><video id="video" width="640" height="480" autoplay></video><button id="snap">拍照</button><button id="record">开始录像</button><button id="stop" disabled>停止录像</button><canvas id="canvas" width="640" height="480" style="display:none;"></canvas><a id="downloadPhoto" style="display:none;">下载照片</a><a id="downloadVideo" style="display:none;">下载视频</a><button id="toggleGrayScale">切换灰度滤镜</button><script src="camera.js"></script>
</body>
</html>

 一些声明

document.addEventListener('DOMContentLoaded', function() {// 当文档加载完成时,执行函数var video = document.getElementById('video');    // 获取页面中id为'video'的<video>元素var canvas = document.getElementById('canvas');    // 获取页面中id为'canvas'的<canvas>元素var context = canvas.getContext('2d');    // 获取canvas的2D绘图上下文var downloadPhoto = document.getElementById('downloadPhoto');    // 获取页面中id为'downloadPhoto'的<a>元素,用于下载照片var downloadVideo = document.getElementById('downloadVideo');    // 获取页面中id为'downloadVideo'的<a>元素,用于下载视频var recordButton = document.getElementById('record');    // 获取页面中id为'record'的按钮元素,用于开始录制视频var stopButton = document.getElementById('stop');    // 获取页面中id为'stop'的按钮元素,用于停止录制视频var mediaRecorder;    // 声明一个变量用于存储MediaRecorder对象var chunks = [];    // 声明一个数组用于存储录制的视频片段var isGrayScale = false; // 用于跟踪是否应用了灰度滤镜

启动摄像头

    navigator.mediaDevices.getUserMedia({ video: true }).then(function(stream) {video.srcObject = stream;video.play();}).catch(function(error) {console.error("Error accessing media devices.", error);});
拍照功能
    document.getElementById('snap').addEventListener('click', function() {canvas.width = video.videoWidth;canvas.height = video.videoHeight;context.drawImage(video, 0, 0, canvas.width, canvas.height);var dataUrl = canvas.toDataURL('image/png');downloadPhoto.href = dataUrl;downloadPhoto.download = getBeijingTimeString()+'.png';downloadPhoto.style.display = 'inline';});
开始录像
    recordButton.addEventListener('click', function() {mediaRecorder = new MediaRecorder(video.srcObject);mediaRecorder.ondataavailable = function(e) {chunks.push(e.data);};mediaRecorder.start();recordButton.disabled = true;stopButton.disabled = false;});
停止录像
    stopButton.addEventListener('click', function() {mediaRecorder.stop();recordButton.disabled = false;stopButton.disabled = true;mediaRecorder.onstop = function() {var blob = new Blob(chunks, { type: 'video/mp4' });chunks = [];var videoUrl = URL.createObjectURL(blob);downloadVideo.href = videoUrl;downloadVideo.download = getBeijingTimeString()+'.mp4';downloadVideo.style.display = 'inline';};});
切换灰度滤镜
    function toggleGrayScale() {isGrayScale = !isGrayScale; // 切换状态var effect = isGrayScale ? 'grayscale(100%)' : 'none';video.style.filter = effect;}

toggleGrayScale按钮添加事件监听器来切换灰度滤镜

    document.getElementById('toggleGrayScale').addEventListener('click', toggleGrayScale);
});
获取当前北京时间的字符串
function getBeijingTimeString() {var date = new Date(); // 获取当前时间var year = date.getFullYear(); // 年var month = (date.getMonth() + 1).toString().padStart(2, '0'); // 月var day = date.getDate().toString().padStart(2, '0'); // 日var hours = date.getHours().toString().padStart(2, '0'); // 小时var minutes = date.getMinutes().toString().padStart(2, '0'); // 分钟var seconds = date.getSeconds().toString().padStart(2, '0'); // 秒// 拼接成年+月+日+小时+分钟+秒的格式return `${year}${month}${day}${hours}${minutes}${seconds}`;
}

 

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

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

相关文章

ENSP之AR路由器一直#####的极端情况判断

系统版本,CPU 如下: 故障原因:AR设备一直###### 分析判断:由于是新安装的系统,没有安全软件限制,防火墙也都放行了,其他一切正常。ENSP凡是要通过virtual box调用的设备都出现了###。判断有两种情况,系统版本或者CPU问题。 通过和客户沟通得知,他对CPU进行了超频。…

如何使用Ida Pro和Core Dump文件定位崩溃位置(Linux下无调试符号的进程专享)

我们在嵌入式Linux开发过程中经常会遇到一个问题,就是程序崩溃后不知道具体位置。因为我们发布到生产环境的一般是没有调试符号的(使用strip或编译时加-s参数,CMake生成的编译指令中的-O3也会造成调试符号丢失),毕竟嵌入式的存储都比较有限,肯定是需要剥离调试符号的。另…

统计学习方法笔记

统计学习方法 1.3 统计学习方法的三要素 1.3.1 模型 好,为什么要从1.3开始呢,因为看前面的课,我还没有用到这个软件。 方法=模型+策略+算法 模型有好多个,试试 策略:按照什么样的准则去选取模型 比如说看预测值和真实值有多大,或者损失函数最小等 算法 即怎样去实现去寻找…

zookeeper的安装与搭建

1、下载zookeeper,并上传到Linux并解压tar -xvf zookeeper-3.5.7.tar.gz -C ../2、修改文件名配置环境变量mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7 vim /etc/profile source /etc/profile3、修改配置文件创建data目录mkdir data创建myid文件touch myid vim myidserver…

Windows Server2022服务器部署RuoYi若依前后端分离

部署准备 虚拟机Windows Server2022 若依前后端分离v3.8.8打包好 jdk1.8 redis5 mysql8.4 iis服务 路由插件 重写插件 1.安装jdk1.8 https://www.azul.com/downloads/#downloads-table-zulu 略 2.安装启动redis5 https://github.com/tporadowski/redis/releases 下载安装默认配…

20222407 2024-2025-1 《网络与系统攻防技术》实验四实验报告

(一)实践目标 恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: o使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; o使用超级巡…

状态压缩动态规划

\(3^n\)枚举子集 状压DP中相当重要的技巧(虽然后位有FWT,FMT替代,但不是都能代) for(int i = x; i; i = (i - 1) & x) { // i 就是 x 的子集 }题目 P6622 [省选联考 2020 A/B 卷] 信号传递 看数据范围,\(m \le 23\),且不同分数段增长很慢,表明会有\(O(2^m)\)的做法,…

专题

求区间第k小值 静态 分块 排序 划分树 动态 主席树 平衡树 子树求交 树上颜色问题 统计颜色数量 对于子树\(x\),子树内同种颜色的点只有深度最浅的对子树外有贡献 #3628. 「2021 集训队互测」树上的孤独 贡献上传:对于\(x\),设它同颜色祖先为\(p\),则\(x\)对路径\(p\thicks…

BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection阅读小结

BEVDet4D提出:提出BEVDet4D范式,将BEVDet从仅空间的3D扩展到时空4D工作空间。BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection BEVDet4D:在多相机三维目标检测中利用时间线索 摘要背景:单帧数据包含有限信息,限制了基于视觉的多相机3D目标检测性能。…

H7-TOOL的LUA小程序教程第17期:扩展驱动AD7606, ADS1256,MCP3421, 8路继电器和5路DS18B20(2024-11-01)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。TOOL的LUA教程争取做到大家可以无痛调…

Print和Println区别

看这样一段程序: // 我的减重程序,lbs是磅的简称package mainimport ("fmt" )func main() {fmt.Println("My weight on the surface of Mars is ")fmt.Println(112 * 0.3783)fmt.Println(" lbs, and I would be ")fmt.Println(19 * 365 / 687)…

【semantic Kernel】Semantic Kernel Tools(VS Code插件)

2023年4月13日,Microsoft发布了一个 Semantic Kernel 的 VS Code 插件,Semantic Kernel Tools,用于进行Semantic Function的开发和调试工作。 Semantic Kernel Tools的安装只需要VS Code即可,不需要额外的其他的环境。 在 VS Code的扩展中搜索 Semantic Kernel Tools ,点击…