Javascript 网络摄像头捕获并使用 PHP 上传到服务器

2024-04-12

我有一个页面,使用 javascript 和 PHP 上传文件成功上传图像表单画布。第二页已成功将网络摄像头捕获到画布并正确显示。我正在尝试使用摄像头捕获实时CSS对象来调整图像上传脚本,但什么也不做... html是: 折断

    <div id="upContent">
    <div class="upload-wrapper">
      <span id="upCanvas">Upload This Canvas</span>
    </div>
    <div class="return-data"></div>
</div>  

    <script src="js/interactioncam.js"></script> 
    <script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <!--script src="js/holder.js"></script-->

JavaScript 是:

//interactioncam.js - grab a pic
(function() {

  var data;
  var dataURL;

  var streaming = false,
      video        = document.querySelector('#video'),
      cover        = document.querySelector('#cover'),
      canvas       = document.querySelector('#canvas'),
      photo        = document.querySelector('#photo'),
      startbutton  = document.querySelector('#startbutton'),
      width = 320,
      height = 240;

  navigator.getMedia = ( navigator.getUserMedia || 
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia ||
                         navigator.msGetUserMedia);

  navigator.getMedia(
    { 
      video: true, 
      audio: false 
    },
    function(stream) {
      if (navigator.mozGetUserMedia) { 
        video.mozSrcObject = stream;
      } else {
        var vendorURL = window.URL || window.webkitURL;
        video.src = vendorURL ? vendorURL.createObjectURL(stream) : stream;
      }
      video.play();
    },
    function(err) {
      console.log("An error occured! " + err);
    }
  );

  video.addEventListener('canplay', function(ev){
    if (!streaming) {
      height = video.videoHeight / (video.videoWidth/width);
      video.setAttribute('width', width);
      video.setAttribute('height', height);
      canvas.setAttribute('width', width);
      canvas.setAttribute('height', height);
      streaming = true;
    }
  }, false);

  function takepicture() {
    canvas.width = width;
    canvas.height = height;
    canvas.getContext('2d').drawImage(video, 0, 0, width, height);
    var data = canvas.toDataURL('image/png');
    var dataURL = canvas.toDataURL();
    photo.setAttribute('src', data);
  };

  startbutton.addEventListener('click', function(ev){
      takepicture();
    ev.preventDefault();
  }, false);

  // Convert DataURL to Blob object
  function dataURLtoBlob(dataURL) {
    // Decode the dataURL
    var dataURL = canvas.toDataURL();    
    var binary = atob(dataURL.split(',')[1]);
    // Create 8-bit unsigned array
    var array = [];
    for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    // Return our Blob object
    return new Blob([new Uint8Array(array)], {type: 'image/png'});
  }

  // Send IT
  $("#upCanvas").live("click", function(){
    $("#upCanvas").html("<img src='img/load.gif' alt='load'>&nbsp;&nbsp;&nbsp;Uploading ..");
    // Convert Canvas DataURL
    var dataURL= canvas.toDataURL();

    // Get Our File
    var file= dataURLtoBlob(dataURL);

    // Create new form data
    var fd = new FormData();

    // Append our image
    fd.append("imageNameHere", file);

    $.ajax({
       url: "uploadFile.php",
       type: "POST",
       data: fd,
       processData: false,
       contentType: false,
    }).done(function(respond){
      $("#upCanvas").html("Upload This Canvas");
        $(".return-data").html("Uploaded Canvas image link: <a href="+respond+">"+respond+"</a>").hide().fadeIn("fast");
    });
  });

})();

php上传是:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
  {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upimg/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

关于为什么我无法将画布转换为文件并且上传脚本无法工作有什么建议吗?


你需要post捕获的图像到php,为此你可以使用jquery .ajax(),这是一个完整的示例:

上传.php

<?php
$img = !empty($_REQUEST['imgBase64']) ? $_REQUEST['imgBase64'] : die("No image was posted");
$imgName = $_REQUEST['imgName'];
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$fileData = base64_decode($img);
//saving
file_put_contents($imgName, $fileData);

Now the js/jquery, css and html:

(function() {
    // The width and height of the captured photo. We will set the
    // width to the value defined here, but the height will be
    // calculated based on the aspect ratio of the input stream.

    var width = 320; // We will scale the photo width to this
    var height = 0; // This will be computed based on the input stream

    // |streaming| indicates whether or not we're currently streaming
    // video from the camera. Obviously, we start at false.

    var streaming = false;

    // The various HTML elements we need to configure or control. These
    // will be set by the startup() function.

    var video = null;
    var canvas = null;
    var photo = null;
    var startbutton = null;

    function startup() {
        video = document.getElementById('video');
        canvas = document.getElementById('canvas');
        photo = document.getElementById('photo');
        startbutton = document.getElementById('startbutton');

        navigator.getMedia = (navigator.getUserMedia ||
            navigator.webkitGetUserMedia ||
            navigator.mozGetUserMedia ||
            navigator.msGetUserMedia);

        navigator.getMedia({
                video: true,
                audio: false
            },
            function(stream) {
                if (navigator.mozGetUserMedia) {
                    video.mozSrcObject = stream;
                } else {
                    var vendorURL = window.URL || window.webkitURL;
                    video.src = vendorURL.createObjectURL(stream);
                }
                video.play();
            },
            function(err) {
                console.log("An error occured! " + err);
            }
        );

        video.addEventListener('canplay', function(ev) {
            if (!streaming) {
                height = video.videoHeight / (video.videoWidth / width);

                // Firefox currently has a bug where the height can't be read from
                // the video, so we will make assumptions if this happens.

                if (isNaN(height)) {
                    height = width / (4 / 3);
                }

                video.setAttribute('width', width);
                video.setAttribute('height', height);
                canvas.setAttribute('width', width);
                canvas.setAttribute('height', height);
                streaming = true;
            }
        }, false);

        startbutton.addEventListener('click', function(ev) {
            takepicture();
            ev.preventDefault();
        }, false);

        clearphoto();
    }

    // Fill the photo with an indication that none has been
    // captured.

    function clearphoto() {
        var context = canvas.getContext('2d');
        context.fillStyle = "#AAA";
        context.fillRect(0, 0, canvas.width, canvas.height);

        var data = canvas.toDataURL('image/png');
        photo.setAttribute('src', data);
    }

    // Capture a photo by fetching the current contents of the video
    // and drawing it into a canvas, then converting that to a PNG
    // format data URL. By drawing it on an offscreen canvas and then
    // drawing that to the screen, we can change its size and/or apply
    // other changes before drawing it.

    function takepicture() {
        var context = canvas.getContext('2d');
        if (width && height) {
            canvas.width = width;
            canvas.height = height;
            context.drawImage(video, 0, 0, width, height);

            var data = canvas.toDataURL('image/png');
            photo.setAttribute('src', data);

            $.ajax({
                type: "POST",
                url: "upload.php",
                data: {
                    imgBase64: data,
                    imgName: "webcam.png"
                }
            }).done(function(o) {
                console.log('saved');
            });
        } else {
            clearphoto();
        }
    }

    // Set up our event listener to run the startup process
    // once loading is complete.
    window.addEventListener('load', startup, false);
})();
#video {
  border: 1px solid black;
  box-shadow: 2px 2px 3px black;
  width:320px;
  height:240px;
}

#photo {
  border: 1px solid black;
  box-shadow: 2px 2px 3px black;
  width:320px;
  height:240px;
}

#canvas {
  display:none;
}

.camera {
  width: 340px;
  display:inline-block;
}

.output {
  width: 340px;
  display:inline-block;
}

#startbutton {
  display:block;
  position:relative;
  margin-left:auto;
  margin-right:auto;
  bottom:32px;
  background-color: rgba(0, 150, 0, 0.5);
  border: 1px solid rgba(255, 255, 255, 0.7);
  box-shadow: 0px 0px 1px 2px rgba(0, 0, 0, 0.2);
  font-size: 14px;
  font-family: "Lucida Grande", "Arial", sans-serif;
  color: rgba(255, 255, 255, 1.0);
}

.contentarea {
  font-size: 16px;
  font-family: "Lucida Grande", "Arial", sans-serif;
  width: 760px;
}
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
	<meta charset='utf-8'>
</head>
<body>
<div class="contentarea">
  <div class="camera">
    <video id="video">Video stream not available.</video>
    <button id="startbutton">Take photo</button> 
  </div>
  <canvas id="canvas">
  </canvas>
  <div class="output">
    <img id="photo" alt="The screen capture will appear in this box."> 
  </div>
</div>
</body>
</html>

基于 :
https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Taking_still_photos https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Taking_still_photos
https://stackoverflow.com/a/13198699/797495 https://stackoverflow.com/a/13198699/797495
https://stackoverflow.com/a/31128229/797495 https://stackoverflow.com/a/31128229/797495


Note:
我已经在我的服务器上测试了代码,它按预期工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 网络摄像头捕获并使用 PHP 上传到服务器 的相关文章

  • JSLint 错误:意外的“这个”

    无法理解为什么 JSLint 对我的使用感到惊讶this在下面的代码中 function testConstr x use strict this joker Whyyy sooo seriousss this x x 对于这两个属性分配
  • 如何在 PHP 中使用 foreach 循环仅回显一次特定的多个相同记录?

    我在 PHP 中使用 foreach 循环得到这些输出 现在 foreach 内部的输出如下所示 PHP代码 table thead tr th ACCOUNT NUMBER th th CATEGORY th th AMOUNT th t
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 启动 onclick 比使用 document.onload 更快

    我有带有链接的 html 页面 我想在其中附加一个功能onclick事件 一种方法当然是 a href save php Save a 但我知道这不是最佳做法 所以我反而等待window onload 循环遍历链接并将保存功能附加到链接re
  • XMLHttpRequest、jQuery.ajax、jQuery.post、jQuery.get 之间有什么区别

    我如何找出最适合某种情况的方法 有人可以提供一些例子来了解功能和性能方面的差异吗 XMLHttpRequest是原始浏览器对象 jQuery 将其包装成更可用和简化的形式以及跨浏览器一致的功能 jQuery ajax是 jQuery 中的通
  • 如何在 AWS Amplify 上运行 React/Redux 应用程序的代理

    我最近实施了Proxy 在 Express js 中 对于我的反应应用程序发出请求时隐藏 API URL 当我在本地主机上运行代理和应用程序时 它工作得非常好 现在我已准备好将我的应用程序部署到AWS 放大 我对如何让我的代理在那里运行有点
  • 什么是闭包编译器?

    如果您不知道我在说什么 请查看以下内容 http closure compiler appspot com home http closure compiler appspot com home 这是一个 JavaScript 压缩器 在他
  • 尝试在本地主机上测试我的 php 文件,但只出现一个空白页面,没有错误消息

    我正在运行 Apache 和 mySQL 因为我检查了所有日志 似乎没有任何错误 我的目标是每当有新的表单条目时就向特定地址发送电子邮件 我对后端和 PHP 缺乏经验 所以我不太确定哪里出了问题 任何帮助将不胜感激
  • JavaScript:嵌套循环?

    我想实现这样的动画 序列 动画以循环开始 想象一下car从 x1 移动到 x2 然后暂停 1 秒 然后再次播放动画 想象一下car从 x2 移动到 x3 等 the car循环是通过向汽车左侧添加 1px 来实现的 值 但我无法弄清楚嵌套循
  • 如何使表格单元格的最小宽度为 3 位数字?

    如何使表格中的每个单元格的最小宽度为 3 位数字且不会更大 现在我正在硬编码min width 但我不喜欢硬编码一个值 因为我将来可能想更改字体 如果需要Javascript也没关系 table border 1 tr td 1 td td
  • 将水平线添加到 html rmarkdown 文档隐藏文本部分

    我正在制作一个与 HTML 页面结合的 Rmarkdown 文档 我不想用标题或项目符号分隔某些文本部分 而是想在它们之间绘制水平线 根据http rmarkdown rstudio com authoring basics html ht
  • 如何制作实时jquery效果?

    我想制作一个实时提要阅读器 并且我想要一个解决方案 使新项目无需刷新页面即可出现 并且具有像friendfeed一样的滚动效果 你可以在这里看到我在说什么 http www vimeo com 4029954 http www vimeo
  • PHP Soap Server:使用字符串(xml 字符串)而不是 WSDL 文件(指向它的 url)实例化

    Soap Server的PHP页面 我见过 http www php net manual en soapserver soapserver php http www php net manual en soapserver soapser
  • JQuery 屏蔽输入插件不起作用

    我已将 JQuery Masked 输入插件添加到我的 Web 项目中 但它根本不起作用 该插件可以在这里找到 http digitalbush com projects masked input plugin http digitalbu
  • FB.getLoginStatus() 不起作用

    我正在尝试编写一段代码来检查用户是否登录 发现FBJS API中有一个内置方法 叫做getLoginStatus 我已经在html中实现了它 但出于某种原因 getLoginStatus 内部的alert 不会被触发 我也尝试在 init
  • Three.js canvas.toDataURL 有时为空

    我正在尝试使用 html2canvas js 渲染 THREE js 场景 一些覆盖的 HTML 元素 有用大多数时候 但并非一直如此 在失败的情况下 将渲染 HTML 元素 背景 覆盖层等 但不会渲染其他元素 THREE js 场景表现得
  • HTML5 画布将颜色应用于形状重叠的图像

    我将此图像绘制到 HTML5 画布上 我想做的就是只给它的一部分应用颜色 我想要应用颜色的部分由以下覆盖图像定义 所以 基本上 我想通过叠加来指导我的着色 因此 在覆盖像素与主图像像素相遇的地方 我应该在主图像上应用颜色 至少我认为它是这样
  • 为什么 [].push([]) 返回 1? [复制]

    这个问题在这里已经有答案了 为什么这会返回 1 push outputs 1 push 返回数组的新长度 one push two returns 2 array length is 2 one two push something ret
  • DOMDocument PHP 内存泄漏

    在 MAC 上的 MAMP 下运行 PHP 5 3 6 内存使用量每调用 x 次 3 到 8 次 就会增加 直到脚本因内存耗尽而终止 我该如何解决 libxml use internal errors true while true dom
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik

随机推荐

  • 我应该将 std::string 与“string”或“string”进行比较吗?

    考虑这个代码片段 bool foo const std string s return s hello comparing against a const char literal bool bar const std string s r
  • 输入文件点击Chrome

    好的 我有一个文件类型和 id test 的输入元素 当我输入地址栏时 javascript document getElementById test click 会弹出打开文件对话框 以便用户可以决定上传什么 但是 如果将同一行插入到文档
  • Spring AOP:- 在 joinPoint 中获取参数名称为 null

    LoggingAspect java Around allGenericAppServiceImplMethods public Object LoggingAdvice ProceedingJoinPoint joinPoint thro
  • Java Logger 不写入文件

    我正在尝试将 Logger 配置为写入应用程序配置文件夹中的文件 但我无法弄清楚如何执行此操作 这是我在程序启动时用于配置日志输出的函数 private void ConfigureLogger Logger logger Logger g
  • 返回正则表达式中匹配的部分

    在使用的正则表达式中OR 管道 是否有一种方便的方法来获取匹配的表达式部分 Example horse caMel TORTOISe i exec Camel returns Camel 我想要的是caMel 我知道我可以循环遍历选项 而不
  • 单步执行断点时出现编译错误

    每当我遇到断点并尝试跨过它或进入它时 我就开始遇到奇怪的错误 我收到消息 进行了无法编译的编辑 在修复编译错误之前 无法继续执行 这些项目编译得很好 当我没有遇到任何断点时 这种情况就不会发生 我使用的是 Visual Studio 201
  • 使用Haxe宏进行条件编译,而不是#if #end

    假设我们有一个 Local 类 class Local static inline public var logLevel Int 3 以及一些功能 Tool debug s String compiled if logLevel gt 0
  • Bonjour 通过蓝牙无需 Gamekit ?

    我想知道在 iPhone OS 3 0 或更高版本中直接通过蓝牙使用 bonjour 而不使用 GameKit 的可能性 谁能提供任何例子吗 只需宣布服务 就像tc 下面已经说了 https stackoverflow com q 3845
  • Xamarin Forms Entry 调用 Completed 事件

    我目前正在 Xamarin Forms 中开发登录和注册页面 将键盘的完成按钮更改为下一个并继续最后一个按钮后 我不再在 Android 上收到 Completed 事件 在 iOS 上工作正常 在自定义渲染器中 我可以捕获 Control
  • 在 mac os x Sierra 上使用 opencv c++ 编译 hello world

    第一次我无法编译 hello world 我已经遵循了大量如何安装 opencv 的教程 我只有以下示例 include
  • 为以 exec 启动的进程设置自定义工作目录

    我正在打电话execv在我的 C 代码中启动可执行文件 但我想将其工作目录设置为自定义目录 例如 在一种情况下 我正在启动ls 但它列出了我原始程序目录中的文件 但我想将工作目录设置为自定义目录 我将如何实现它 这样 我将其设置为 usr
  • 无法将 Watson IoT Platform 连接到 Cloudant

    一段时间以来 我一直在尝试将 Watson IoT Platform 作为 Historian 服务连接到 Cloudant 数据库 我遵循了各种可用教程中的说明 但一项服务从未显示为与另一项服务的可能连接或扩展 这是我尝试过的一个教程ht
  • ios 8 解析推送中没有声音[重复]

    这个问题在这里已经有答案了 这很奇怪 更新我的应用程序以支持通过 Parse 使用 Parse 仪表板 发送的 iOS 8 推送通知后 推送通知不会发出任何声音 我在 Stackoverflow 上发现了这个重复项 但发布的答案对我不起作用
  • 解析 JSON 到 MySQL 表

    我正在使用 Zend Framework 1 12 我想创建一个基于 JSON 文件的表 我已经创建了表及其字段 现在它们都是长文本 它所要做的就是将它们插入到正确的列中 我遵循了这些例子 http www daniweb com web
  • 代表和活动之间有什么区别?

    代表和活动之间有什么区别 两者不都包含对可以执行的函数的引用吗 An Event声明增加了一层抽象和保护delegate实例 此保护可防止委托的客户端重置委托及其调用列表 并且仅允许在调用列表中添加或删除目标
  • WCF 中未返回 DateTime.Kind

    当处理DateTime具有 WCF 的对象 返回DateTime对象丢失了Kind财产 永远是DateTimeKind Unspecified即使我在退货之前手动更改它 我在 WCF 端这样做了 dateFrom DateTime Spec
  • 根据用户 ID 限制下拉选项

    我问这个问题是因为我不确定解决问题的最佳方法 问题 我有一个预先填充的下拉列表 其中包含 1 000 个左右的数字 我需要根据使用下拉列表的用户来限制下拉列表中显示的数字 我想到的解决方案 使用 jQuery 隐藏所有数字 使用 jQuer
  • Firebase:如何检查电子邮件是否在运行时经过验证

    所以流程将是这样的 用户通过 firebase 使用电子邮件和密码登录 如果电子邮件经过验证 他们将转到主要活动 否则他们将进入验证电子邮件活动 我想做的是 当他们处于验证电子邮件活动时 我将在 onCreate 方法中发送验证电子邮件 然
  • 有没有办法用#define 代替长命名空间?

    假设我有一个很长的命名空间 我不想一直输入它 但我不想使用using namespace 任何一个 我可以为此使用 define 吗 Example define glm quat glm gtc quaternion class Came
  • Javascript 网络摄像头捕获并使用 PHP 上传到服务器

    我有一个页面 使用 javascript 和 PHP 上传文件成功上传图像表单画布 第二页已成功将网络摄像头捕获到画布并正确显示 我正在尝试使用摄像头捕获实时CSS对象来调整图像上传脚本 但什么也不做 html是 折断 div div cl