JS 利用 webcam访问摄像头 上传到服务器

news2024/10/7 13:17:15

webcam JS 较为详细的指南

定义标题

<!doctype html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>How to capture picture from webcam with Webcam.js</title>

</head>
<body>  
  • <meta> 标签用于设置页面的视口(viewport),
  • content 属性指定了视口的宽度为设备的宽度,并启用了初始缩放比例为 1.0。这样可以确保页面在不同设备上以适当的方式显示。
  • <title> 标签定义了页面的标题,显示在浏览器的标签页或标题栏上,本例中标题为 “How to capture picture from webcam with Webcam.js”。

定义my_camera样式

	<!-- CSS -->
    <style>	<!-- 定义my_camera样式 -->
    #my_camera{
        width: 320px;
        height: 240px;
        border: 1px solid black;
    }
	</style>
  • 这段代码定义了一个样式规则,在 HTML 页面中为 id 为 “my_camera” 的元素应用了该样式。
  • 在样式规则中,width 属性设置了元素的宽度为 320 像素,height 属性设置了元素的高度为 240 像素,border 属性设置了元素的边框为 1 像素的黑色实线。
  • 这段代码可以用于定义一个相机显示区域的样式,使其具有固定的宽度和高度,并且有一个黑色的边框。

JS.div

  • HTML 的 <div> 是一个块级元素。它是一个无语义的容器元素,用于将其他元素分组在一起,以便样式和布局的目的。
  • <div> 元素没有默认的样式或行为,仅仅提供了一个空的盒子,可以通过 CSS 来自定义其外观和行为。
  • <div> 元素可以包含其他任意元素,包括文本、图片、表单等等。

define a device

	<!-- -->
	<div id="my_camera"></div>
	<input type=button value="Configure" onClick="configure()">
	<input type=button value="Take Snapshot" onClick="take_snapshot()">
	<input type=button value="Save Snapshot" onClick="saveSnap()">
	
    <div id="results"  ></div>
  • 这段代码是一个 HTML 页面的主体部分,包含了一个用于显示摄像头视频的容器、三个按钮和一个用于显示结果的容器。
  • <div id="my_camera"></div> 是一个空的 <div> 元素,它的 id 属性被设置为 “my_camera”。这个元素用于显示摄像头视频,后面的 JavaScript 代码会将摄像头视频渲染到这个元素中。
  • <input> 元素是用来创建按钮的,有三个按钮分别是 “Configure”、“Take Snapshot” 和 “Save Snapshot”。每个按钮都有一个 onClick 属性,用于指定按钮被点击时所触发的 JavaScript 函数。
  • 接下来的代码 <div id="results"></div> 是另一个空的 <div> 元素,它的 id 属性被设置为 “results”。这个元素用于显示操作结果,例如当用户点击 “Save Snapshot” 按钮时,JavaScript 代码会将截取的照片显示在这个元素中。

define js action

	<!-- Script -->
	<script type="text/javascript" src="webcamjs/webcam.min.js"></script>
	...
	</script>
  • 这行代码是在 HTML 页面中引入了一个外部的 JavaScript 文件。
  • 通过使用 <script> 标签和 src 属性,可以将 webcam.min.js 文件加载到页面中。
  • 这个文件是 webcam.js 库的压缩版本,它提供了一些用于操作和控制摄像头的函数和方法,以便在网页中捕捉图像或视频。通过引入这个 JavaScript 文件,可以在后续的代码中使用这个库提供的功能。

webcam.min.js

set style of camera

	<!-- Code to handle taking the snapshot and displaying it locally -->
	<script language="JavaScript">
		
		// Configure a few settings and attach camera
		function configure(){
			Webcam.set({
				width: 320,
				height: 240,
				image_format: 'jpeg',
				jpeg_quality: 90
			});
			Webcam.attach( '#my_camera' );
		}
		// A button for taking snaps

navigator

navigator 是 JavaScript 中的一个内置对象,用于提供有关浏览器环境和用户代理的信息。它包含了一系列的属性和方法,可以用来获取和操作与浏览器相关的信息。下面是一些 navigator 对象的常用属性:

  • navigator.userAgent:返回包含浏览器用户代理字符串的字符串。
  • navigator.language:返回当前浏览器环境的首选语言。
  • navigator.platform:返回运行浏览器的操作系统平台。
  • navigator.appVersion:返回浏览器的版本号和操作系统信息。

通过使用 navigator 对象,可以根据浏览器的不同特性和功能来进行相关的逻辑判断和操作,从而提供更好的用户体验或调整功能的实现方式。

		// preload shutter audio clip
		var shutter = new Audio();
		shutter.autoplay = false;
		shutter.src = navigator.userAgent.match(/Firefox/) ? 'shutter.ogg' : 'shutter.mp3';

take snapshot

		function take_snapshot() {
			// play sound effect
			shutter.play();

			// take snapshot and get image data
			Webcam.snap( function(data_uri) {
				// display results in page
				document.getElementById('results').innerHTML = 
					'<img id="imageprev" src="'+data_uri+'"/>';
				console.log('Capture successfully');
			} );

			Webcam.reset();
		}

Question what’s data_uri

在JavaScript中,data URI(Uniform Resource Identifier)是一种用来嵌入小型数据的方式。它是一种特殊的URL格式,可以将数据直接嵌入到HTML、CSS、JavaScript等文件中,而无需引用外部资源文件。

* Data URI的格式如下:

data:[mediatype][;base64],<data>

其中,mediatype是数据的MIME类型(例如,image/jpeg表示JPEG格式的图像,text/plain表示纯文本),base64是可选的,表示是否使用base64编码,<data>是实际的数据内容。

* 例如,一个包含了纯文本的data URI如下:

data:text/plain,Hello%20World!

* 一个包含了base64编码图像的data URI如下:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD...(以下省略)

Display

上面的id="imageprev"的datauri如下,严格按照 😊 base64编码的图像格式 😊
在这里插入图片描述

data URI的优点是可以减少HTTP请求数量,提高网页的加载速度。但是,由于数据直接嵌入到文件中,会增加文件的大小,可能导致文件变得更大,在一些情况下可能不适用。另外,不同浏览器对data URI的限制也有所不同,需要注意兼容性问题。

savesnap

		function saveSnap(){
			// Get base64 value from <img id='imageprev'> source
			var base64image =  document.getElementById("imageprev").src;

			Webcam.upload( base64image, 'upload.php', function(code, text) {
				console.log('Save successfully');
				//console.log(text);
            });

		}
	</script>
	
</body>
</html>

upload.php

<?php

// new filename
$filename = 'pic_'.date('YmdHis') . '.jpeg';

$url = '';
if( move_uploaded_file($_FILES['webcam'][$filename],'upload/'.$filename) ){
	$url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']) . '/upload/' . $filename;
}

// Return image url
echo $url;
?>

upload.js

  • 尚未成功
```javascript 
// 获取base64图片数据
var base64Image = document.getElementById('imageprev').src;

// 将base64图片数据转换为Blob对象
var byteCharacters = atob(base64Image.split(',')[1]);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
  byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var blobImage = new Blob([byteArray], { type: 'image/jpeg' });

// 创建一个FormData对象
var formData = new FormData();
formData.append('webcam', blobImage, 'image.jpeg');

// 创建一个XMLHttpRequest对象
var xhr = new XMLHttpRequest();

// 定义请求完成后的回调函数
xhr.onload = function() {
  if (xhr.status === 200) {
    var imageUrl = xhr.responseText;
    console.log('图像已上传,URL为:', imageUrl);
  } else {
    console.log('上传图像时发生错误');
  }
};

// 发送POST请求到服务器的/upload文件夹
xhr.open('POST', '/upload', true);
xhr.send(formData);

文件上传by php

php.move_uploaded_file
在这里插入图片描述
php.$_FILES
tomcat&php&mysql

upload by js

Blob、File 、DataURL(Base64)、BlobURL 之间的类型闭环,你确定都知道?

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

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

相关文章

【UnityRPG游戏制作】Unity_RPG项目之界面面板分离和搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

计算机视觉——基于傅里叶幅度谱文档倾斜度检测与校正

概述 在计算机视觉领域&#xff0c;处理文档数据时&#xff0c;OCR算法的性能往往会受到文档的倾斜度影响。如果文档在输入到模型之前没有经过恰当的校正&#xff0c;模型就无法期待模型能够提供准确的预测结果&#xff0c;或者模型预测的精度会降低。例如&#xff0c;在信息提…

python上传以及下载AWS S3上的文件

​ 免死金牌 由于本人平常是做NodeJS开发的&#xff0c;本次做的任务含有 Scheduled Job &#xff0c;所以选择了使用Python作为这次开发的语言&#xff0c;毕竟跑脚本还是这玩意适合。 其中有一个任务是要从S3上拉下一些文件来处理&#xff0c;处理完成后再push 上去的需求…

深入浅出 -- 系统架构之负载均衡Nginx动静分离

一、Nginx动静分离 动静分离应该是听的次数较多的性能优化方案&#xff0c;那先思考一个问题&#xff1a;为什么需要做动静分离呢&#xff1f;它带来的好处是什么&#xff1f; 其实这个问题也并不难回答&#xff0c;当你搞懂了网站的本质后&#xff0c;自然就理解了动静分离的重…

【学习分享】小白写算法之选择排序篇

【学习分享】小白写算法之选择排序篇 前言一、什么是选择排序算法二、选择排序算法如何实现三、C语言实现算法四、复杂度计算五、算法稳定性六、小结 前言 简单排序有三种&#xff0c;冒泡排序&#xff0c;插入排序和选择排序。这三种排序的算法算是入门级别的&#xff0c;打好…

torchvision中的数据集使用

torchvision中的数据集使用 使用和下载CIFAR10数据集 输出测试集中的第一个元素&#xff08;输出img信息和target&#xff09; 查看分类classes 打断点–>右键Debug–>找到classes 代码 import torchvisiontrain_set torchvision.datasets.CIFAR10(root"./data…

显示学习1(基于树莓派Pico) -- 基础

先上图为敬。 驱动的是0.96寸的OLED&#xff0c;SSD1315。使用的I2C接口驱动。 有一说一树莓派Pico用来学习底层真的太好了&#xff0c;没有之一。首先是价格便宜&#xff0c;10块钱包邮还要什么自行车。然后底层封装很完备&#xff0c;接近闭源。最后是用的python&#xff0c…

4.2.k8s的pod-标签管理、镜像拉取策略、容器重启策略、资源限制、优雅终止

一、标签管理 1.标签在k8s中极其重要&#xff0c;大多数资源的相互关联就需要使用标签&#xff1b;也就是说&#xff0c;资源的相互关联大多数时候&#xff0c;是使用标签进行关联的&#xff1b; 2.其他作用&#xff0c;在k8s集群中&#xff0c;node节点的一些操作比如污点及污…

Python向带有SSL/TSL认证服务器发送网络请求小实践(附并发http请求实现asyncio+aiohttp)

1. 写在前面 最近工作中遇到这样的一个场景&#xff1a;给客户发送文件的时候&#xff0c;为保证整个过程中&#xff0c;文件不会被篡改&#xff0c;需要在发送文件之间&#xff0c; 对发送的文件进行签名&#xff0c; 而整个签名系统是另外一个团队做的&#xff0c; 提供了一…

c# wpf XmlDataProvider 简单试验

1.概要 2.代码 <Window x:Class"WpfApp2.Window12"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend…

【一】学习TDengine-总结新技术学习的思考

学习TDengine-总结新技术学习的思考 概要 因业务场景需要我们开始接触时序数据库&#xff0c;于是开始根据以往的学习经验着手熟悉这一项新技术&#xff0c;学习也是一种技能&#xff0c;成功的人越容易成功&#xff0c;因为他们掌握了一套成功的方法&#xff0c;这里提到学习经…

Docker容器与虚拟化技术:OpenEuler 部署 Prometheus 与 Grafana

目录 一、实验 1.环境 2.OpenEuler 部署 Prometheus 3.OpenEuler 部署 Grafana 4.使用cpolar内网穿透 二、问题 1.拉取镜像失败 2.如何导入Grafana监控模板&#xff08;ES&#xff09; 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注…

机器学习(理论第一课)

一、理解人工智能、机器学习、深度学习、强化学习&#xff1f; 人工智能、机器学习和深度学习之间存在递进关系&#xff0c;它们的覆盖范围逐层递减。 **人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;**是最宽泛的概念&#xff0c;旨在研究、开发用于…

第十四届蓝桥杯物联网试题(省赛)

这个题还是有点难度的&#xff0c;刚好能做完&#xff0c;还遇到一个意料之外的BUG,这次算是失败了&#xff0c;因为那个BUG让我以为是板子坏了其实是我LORA没初始化 储存信息用结构体存储 第一次写结构体能一次实验成功也挺开心的 值得赞扬的是我这样排版的好处是所有变量都在…

基于Whisper的实时语音识别(1): 流式显示视频帧和音频帧

Whistream &#xff08;微流&#xff09;是基于openai-whisper 大语音模型下的流式语音识别工具 本期主要介绍实时显示工具Whishow&#xff0c;可以实时逐帧显示视频流&#xff08;RTSP/RTMP&#xff09;和离线文件&#xff08;mp4,avi等&#xff09; 下载地址&#xff1a;ht…

复现chatgpt_ros,需要openapi key

&#xff11;&#xff0e; 前置工作&#xff1a; 现在&#xff55;buntu系统是20.04ros1&#xff0c;现在用docker新建并安装ros2&#xff1a; 最简单的&#xff0c;用大佬的一键安装&#xff1a; wget http://fishros.com/install -O fishros && . fishros 其次自己装…

深入浅出 -- 系统架构之负载均衡Nginx资源压缩

一、Nginx资源压缩 建立在动静分离的基础之上&#xff0c;如果一个静态资源的Size越小&#xff0c;那么自然传输速度会更快&#xff0c;同时也会更节省带宽&#xff0c;因此我们在部署项目时&#xff0c;也可以通过Nginx对于静态资源实现压缩传输&#xff0c;一方面可以节省带宽…

【微信小程序】【小程序样式加载不出来】

微信小程序配置sass 第一步&#xff1a;找配置文件 在项目中找到 project.config.json文件&#xff0c;在setting属性中添加 useCompilerPlugins属性&#xff0c;值为sass即可&#xff0c;若是 less,将数组里面的值改为less即可 "useCompilerPlugins": ["sas…

MySQL复制拓扑1

文章目录 主要内容一.安装MySQL服务器1.MySQL 安装程序和其它文件保存在下发的 mysql8-files.iso 镜像文件中&#xff0c;可以使用虚拟光驱来提取到 Linux 文件系统。代码如下&#xff08;示例&#xff09;: 2.将 MySQL8.0 程序解压到 /opt 目录&#xff0c;再创建到 MySQL 默认…

08 Python进阶:XML 解析

什么是 XML&#xff1f; XML&#xff08;可扩展标记语言&#xff0c;Extensible Markup Language&#xff09;是一种用于表示和传输数据的标记语言。它被设计用来以一种结构化的形式描述文档的内容&#xff0c;并且具有良好的跨平台和跨语言的特性。XML使用标签来定义数据的结构…