使用 HTML5 控制摄像头摄像和拍照

阳光穿透心脏的1/2处 2023-10-02 11:00 86阅读 0赞

访问相机的方法最初是navigator.getUserMedianavigator.mediaDevices.getUserMedia.

浏览器供应商最近裁定,它getUserMedia应该只适用于https:协议。您需要 SSL 证书才能使此 API 工作。

移动和桌面设备上的客户端 API 正在快速提供相同的 API。当然,我们的移动设备首先可以访问其中一些 API,但这些 API 正在慢慢进入桌面。这些 API 之一是 getUserMedia API,为开发人员提供对用户相机的访问。让我向您展示如何从浏览器中获取简单的相机访问权限!

查看演示

HTML

请阅读我关于以下 HTML 结构的说明:

  1. <!--
  2. Ideally these elements aren't created until it's confirmed that the
  3. client supports video/camera, but for the sake of illustrating the
  4. elements involved, they are created with markup (not JavaScript)
  5. -->
  6. <video id="video" width="640" height="480" autoplay></video>
  7. <button id="snap">Snap Photo</button>
  8. <canvas id="canvas" width="640" height="480"></canvas>

一旦确认相机支持,就应该创建这些元素中的每一个,但为了本教程,我想向您展示基本 HTML 元素的外观。请注意,我们使用的尺寸是 640x480。

JavaScript

由于上面的 HTML 元素已经创建,JavaScript 部分看起来比您想象的要小:

  1. // Grab elements, create settings, etc.
  2. var video = document.getElementById('video');
  3. // Get access to the camera!
  4. if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
  5. // Not adding `{ audio: true }` since we only want video now
  6. navigator.mediaDevices.getUserMedia({ video: true }).then(function(stream) {
  7. //video.src = window.URL.createObjectURL(stream);
  8. video.srcObject = stream;
  9. video.play();
  10. });
  11. }
  12. /* Legacy code below: getUserMedia
  13. else if(navigator.getUserMedia) { // Standard
  14. navigator.getUserMedia({ video: true }, function(stream) {
  15. video.src = stream;
  16. video.play();
  17. }, errBack);
  18. } else if(navigator.webkitGetUserMedia) { // WebKit-prefixed
  19. navigator.webkitGetUserMedia({ video: true }, function(stream){
  20. video.src = window.webkitURL.createObjectURL(stream);
  21. video.play();
  22. }, errBack);
  23. } else if(navigator.mozGetUserMedia) { // Mozilla-prefixed
  24. navigator.mozGetUserMedia({ video: true }, function(stream){
  25. video.srcObject = stream;
  26. video.play();
  27. }, errBack);
  28. }
  29. */

一旦确定浏览器支持navigator.mediaDevices.getUserMedia,一个简单的方法将video元素设置src为用户的实时摄像头/网络摄像头。调用play视频的方法然后启动元素的实时流视频连接。这就是将您的相机连接到浏览器所需的全部内容!

拍照只是稍微困难一些。只需将点击监听器添加到通用按钮,然后从视频中绘制图像即可!

  1. // Elements for taking the snapshot
  2. var canvas = document.getElementById('canvas');
  3. var context = canvas.getContext('2d');
  4. var video = document.getElementById('video');
  5. // Trigger photo take
  6. document.getElementById("snap").addEventListener("click", function() {
  7. context.drawImage(video, 0, 0, 640, 480);
  8. });

当然,您可以添加一些性感的图像过滤器并赚取 10 亿美元……但我会将其留到另一篇文章中。不过,您至少可以将画布快照转换为图像 !我将在未来谈论画布图像过滤器……

查看演示

能够在不使用第三方软件的情况下在浏览器中访问相机是一项了不起的进步。搭配画布和一些 JavaScript,相机变得快速且易于访问。不仅可以使用相机,而且由于画布非常灵活,我们将来可以添加性感的 Instagram 风格的图像过滤器。然而,就目前而言,只需访问浏览器中的摄像头即可让我们领先数英里。玩得开心在浏览器中拍摄图像!

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. <meta name="generator" content="PSPad editor, www.pspad.com">
  6. <title></title>
  7. </head>
  8. <body>
  9. <video id="video" width="640" height="480" autoplay></video>
  10. <button id="snap">Snap Photo</button>
  11. <canvas id="canvas" width="640" height="480"></canvas>
  12. <script type="text/javascript">
  13. // Grab elements, create settings, etc.
  14. var video = document.getElementById('video');
  15. // Get access to the camera!
  16. if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
  17. // Not adding `{ audio: true }` since we only want video now
  18. navigator.mediaDevices.getUserMedia({video: true}).then(function (stream) {
  19. //video.src = window.URL.createObjectURL(stream);
  20. video.srcObject = stream;
  21. video.play();
  22. });
  23. }
  24. /* Legacy code below: getUserMedia
  25. else if(navigator.getUserMedia) { // Standard
  26. navigator.getUserMedia({ video: true }, function(stream) {
  27. video.src = stream;
  28. video.play();
  29. }, errBack);
  30. } else if(navigator.webkitGetUserMedia) { // WebKit-prefixed
  31. navigator.webkitGetUserMedia({ video: true }, function(stream){
  32. video.src = window.webkitURL.createObjectURL(stream);
  33. video.play();
  34. }, errBack);
  35. } else if(navigator.mozGetUserMedia) { // Mozilla-prefixed
  36. navigator.mozGetUserMedia({ video: true }, function(stream){
  37. video.srcObject = stream;
  38. video.play();
  39. }, errBack);
  40. }
  41. */
  42. // Elements for taking the snapshot
  43. var canvas = document.getElementById('canvas');
  44. var context = canvas.getContext('2d');
  45. var video = document.getElementById('video');
  46. // Trigger photo take
  47. document.getElementById("snap").addEventListener("click", function () {
  48. context.drawImage(video, 0, 0, 640, 480);
  49. });
  50. </script>
  51. </body>
  52. </html>

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读

    相关 控制摄像头拍照

    现在的智能手机和平板电脑一般都会提供摄像头拍照功能。在Android中提供了专门用于处理摄像头相关事件的类,即android.hardware包中的Camera类。Camer