HTML调用摄像头

2 篇文章 0 订阅
2 篇文章 0 订阅

HTML5调用手机摄像头拍照

文末附有完整代码

移动端拍照示例在这里插入图片描述

PC端拍照示例

在这里插入图片描述

示例代码

在这里插入图片描述

判断是手机端还是PC端

function isMobile() {
	let userAgentInfo = navigator.userAgent;
	let mobileAgents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
	let mobile_flag = false;
	//根据userAgent判断是否是手机
	for (let v = 0; v < mobileAgents.length; v++) {
		if (userAgentInfo.indexOf(mobileAgents[v]) > 0) {
			mobile_flag = true;
			break;
		}
	}
	let screen_width = window.screen.width;
	let screen_height = window.screen.height;
	//根据屏幕分辨率判断是否是手机
	if (screen_width > 325 && screen_height < 750) {
		mobile_flag = true;
	}
	return mobile_flag;
}

判断浏览器是否支持

if (navigator.mediaDevices === undefined) {
	navigator.mediaDevices = {};
}
if (navigator.mediaDevices.getUserMedia === undefined) {
	navigator.mediaDevices.getUserMedia = function(constraints) {
		vargetUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
		if (!getUserMedia) {
			returnPromise.reject(newError('getUserMedia is not implemented in this browser'));
		}
		return newPromise(function(resolve, reject) {
			getUserMedia.call(navigator, constraints, resolve, reject);
		});
	}
}

调用摄像机

let constraints = {video: true};
navigator.mediaDevices.getUserMedia(constraints)
	.then(function(stream) {
		if ("srcObject" in video) {
			video.srcObject = stream;
		} else {
			video.src = window.URL.createObjectURL(stream);
		}
		video.onloadedmetadata = function(e) {
			video.play();
		};
	}).catch(function(err) {
		console.log(err.name + ":" + err.message);
	});

点击按钮拍照事件

capture.addEventListener('click', function(e) {
	if (!flag) {
		context.drawImage(video, 0, 0, canvas.width, canvas.height);
		$(canvas).show();
		$(video).hide();
		$(capture).text("重新拍照");
		flag = true;
	} else {
		$(video).show();
		$(canvas).hide();
		$(capture).text("拍照");
		flag = false;
	}
});

完整代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>调用摄像头拍照</title>
		<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
		<script>
			// 是否是手机
			function isMobile() {
				let userAgentInfo = navigator.userAgent;
				let mobileAgents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
				let mobile_flag = false;
				//根据userAgent判断是否是手机
				for (let v = 0; v < mobileAgents.length; v++) {
					if (userAgentInfo.indexOf(mobileAgents[v]) > 0) {
						mobile_flag = true;
						break;
					}
				}
				let screen_width = window.screen.width;
				let screen_height = window.screen.height;
				//根据屏幕分辨率判断是否是手机
				if (screen_width > 325 && screen_height < 750) {
					mobile_flag = true;
				}
				return mobile_flag;
			}
		</script>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}

			#capture {
				width: 80px;
				height: 80px;
				border-radius: 50%;
				line-height: 50px;
				text-align: center;
			}

			canvas {
				width: 50%;
				height: 50%;
				display: none;
			}

			video {
				width: 45%;
				height: 45%;
			}
		</style>
	</head>
	<body>
		<canvas id="canvas" width="720" height="540"></canvas>
		<video id="video"></video>
		<br /><button id="capture">拍照</button>

		<script type="text/javascript">
			let flag = false;
			const video = document.getElementById('video');
			const capture = document.getElementById('capture');
			const canvas = document.getElementById('canvas');
			const context = canvas.getContext('2d');
			const screen_W = window.innerWidth || document.body.clientWidth;
			const screen_H = window.innerHeight || document.body.clientHeight;
			canvas.width = screen_W * 3;
			canvas.height = screen_H * 3 + 12;
			if (isMobile()) {
				$(canvas).css({"width": "95%"});
				canvas.width = screen_W * 2.5;
				canvas.height = screen_W * 3 + 12;
				alert("phone");
			}
			if (navigator.mediaDevices === undefined) {
				navigator.mediaDevices = {};
			}
			if (navigator.mediaDevices.getUserMedia === undefined) {
				navigator.mediaDevices.getUserMedia = function(constraints) {
					vargetUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
					if (!getUserMedia) {
						returnPromise.reject(newError('getUserMedia is not implemented in this browser'));
					}
					return newPromise(function(resolve, reject) {
						getUserMedia.call(navigator, constraints, resolve, reject);
					});
				}
			}
			//默认使用前摄像头,强制使用后置摄像头如下设置
			//let constraints = {video: { facingMode: { exact: "environment" } }};
			let constraints = {video: true};
			navigator.mediaDevices.getUserMedia(constraints)
				.then(function(stream) {
					if ("srcObject" in video) {
						video.srcObject = stream;
					} else {
						video.src = window.URL.createObjectURL(stream);
					}
					video.onloadedmetadata = function(e) {
						video.play();
					};
				}).catch(function(err) {
					console.log(err.name + ":" + err.message);
				});

			capture.addEventListener('click', function(e) {
				if (!flag) {
					context.drawImage(video, 0, 0, canvas.width, canvas.height);
					$(canvas).show();
					$(video).hide();
					$(capture).text("重新拍照");
					flag = true;
				} else {
					$(video).show();
					$(canvas).hide();
					$(capture).text("拍照");
					flag = false;
				}
			});
		</script>
	</body>
</html>

原文地址:https://blog.csdn.net/weixin_39980002/article/details/111786200

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个实现在移动端HTML调用摄像头并支持美颜的示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Camera Beauty</title> <style> #videoElement { width: 100%; height: auto; max-width: 600px; margin: 0 auto; } </style> </head> <body> <video id="videoElement"></video> <script> // 获取video元素 const video = document.getElementById('videoElement'); // 判断是否支持调用摄像头 if (navigator.mediaDevices.getUserMedia) { // 调用摄像头 navigator.mediaDevices.getUserMedia({ video: true }) .then(function (stream) { // 将摄像头渲染到video元素中 video.srcObject = stream; }) .catch(function (error) { console.log("Something went wrong!"); }); } // 美颜滤镜 const setFilter = () => { // 创建canvas元素,用于渲染滤镜效果 const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; context.drawImage(video, 0, 0, canvas.width, canvas.height); const imageData = context.getImageData(0, 0, canvas.width, canvas.height); const data = imageData.data; for (let i = 0; i < data.length; i += 4) { let r = data[i]; let g = data[i + 1]; let b = data[i + 2]; data[i] = (r * 0.393) + (g * 0.769) + (b * 0.189); data[i + 1] = (r * 0.349) + (g * 0.686) + (b * 0.168); data[i + 2] = (r * 0.272) + (g * 0.534) + (b * 0.131); } context.putImageData(imageData, 0, 0); // 将滤镜效果渲染到video元素中 video.style.backgroundImage = `url(${canvas.toDataURL()})`; }; // 调用美颜滤镜 video.addEventListener('play', () => { setInterval(setFilter, 10); }, false); </script> </body> </html> ``` 其中,通过 `navigator.mediaDevices.getUserMedia` 方法调用摄像头,将摄像头渲染到 `<video>` 元素中;通过 `setFilter` 方法实现美颜滤镜效果,并将滤镜效果渲染到 `<video>` 元素中。最终实现在移动端HTML调用摄像头并支持美颜的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值