web 摄像头拍照并上传

2023-10-27

  通过2天的查找资料,终于找到了 摄像头拍照的方法并调试成功;在ie,及火狐等浏览器测试通过。

ie 拍照:

服务端存储照片

 

 

现在分享下经验;

1、js控件 jQuery webcam plugin (官网 http://www.xarg.org/project/jquery-webcam-plugin/)

2、按照官网的例子 可以看到 摄像头图形,但无法进行拍照 ,错误提示“webcam.capture” 不是一个函数。

3、然后查找各种问题,最后发现需要 在本地 flash 设置开启 安全设置

 

4、php 接受图片存储 (就不累赘)

5、最后奉献源码(没有整理)

html

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>jQuery webcam plugin • Code is poetry</title><!-- 1478091437 -->
<link rel="icon" type="image/x-icon">

</head>
<body>
<div id="webcam"  style=""   >
                    <!--    <object width="218" height="240" data="newSrc/jscam_canvas_only.swf" type="application/x-shockwave-flash" id="XwebcamXobjectX">
                            <param value="newSrc/jscam_canvas_only.swf" name="movie">
                            <param value="mode=callback&quality=85" name="FlashVars"><param value="always" name="allowScriptAccess"></object>

                            <div class="takepic">
                                <a class="clicktosnap disabled" id="clicktosnap"> Take a picture now! </a>
                        </div>-->
   <a class="clicktosnap disabled" id="clicktosnap"> Take a picture now! </a>
    </div>
                <canvas width="320" height="240"  id="canvas" ></canvas>
                 <img id="primaryweb" width="220"  style="display: none;"  height="220" src="http://127.0.0.1/ex/main//upload/copy/">

    <p id="status">aa</p>

  
  
    

<script src="newSrc/jquery-1.7.2.js"></script>
 <script src="newSrc/jquery.webcam.min.js"></script> 
        
    

<script>
     $(document).ready(function(){

        var pos = 0;
        var ctx = null;
        var cam = null;
        var image = null;

        var filter_on = false;
        var filter_id = 0;

        function changeFilter() {
            if (filter_on) {
                filter_id = (filter_id + 1) & 7;
            }
        }

        function toggleFilter(obj) {
            if (filter_on =!filter_on) {
                obj.parentNode.style.borderColor = "#c00";
            } else {
                obj.parentNode.style.borderColor = "#333";
            }
        }

      //   alert("waw");


    jQuery("#webcam").webcam({

        width: 320,
        height: 240,

        mode: "callback",
        swffile: "newSrc/jscam_canvas_only.swf",



        onTick: function(remain) {

            if (0 == remain) {
                jQuery("#status").text("Cheese!");
            } else {
                jQuery("#status").text(remain + " seconds remaining...");
            }
        },

        onSave: function(data) {

            var col = data.split(";");
            var img = image;

            if (false == filter_on) {

                for(var i = 0; i < 320; i++) {
                    var tmp = parseInt(col[i]);
                    img.data[pos + 0] = (tmp >> 16) & 0xff;
                    img.data[pos + 1] = (tmp >> 8) & 0xff;
                    img.data[pos + 2] = tmp & 0xff;
                    img.data[pos + 3] = 0xff;
                    pos+= 4;
                }

            } else {

                var id = filter_id;
                var r,g,b;
                var r1 = Math.floor(Math.random() * 255);
                var r2 = Math.floor(Math.random() * 255);
                var r3 = Math.floor(Math.random() * 255);

                for(var i = 0; i < 320; i++) {
                    var tmp = parseInt(col[i]);

                    /* Copied some xcolor methods here to be faster than calling all methods inside of xcolor and to not serve complete library with every req */

                    if (id == 0) {
                        r = (tmp >> 16) & 0xff;
                        g = 0xff;
                        b = 0xff;
                    } else if (id == 1) {
                        r = 0xff;
                        g = (tmp >> 8) & 0xff;
                        b = 0xff;
                    } else if (id == 2) {
                        r = 0xff;
                        g = 0xff;
                        b = tmp & 0xff;
                    } else if (id == 3) {
                        r = 0xff ^ ((tmp >> 16) & 0xff);
                        g = 0xff ^ ((tmp >> 8) & 0xff);
                        b = 0xff ^ (tmp & 0xff);
                    } else if (id == 4) {

                        r = (tmp >> 16) & 0xff;
                        g = (tmp >> 8) & 0xff;
                        b = tmp & 0xff;
                        var v = Math.min(Math.floor(.35 + 13 * (r + g + b) / 60), 255);
                        r = v;
                        g = v;
                        b = v;
                    } else if (id == 5) {
                        r = (tmp >> 16) & 0xff;
                        g = (tmp >> 8) & 0xff;
                        b = tmp & 0xff;
                        if ((r+= 32) < 0) r = 0;
                        if ((g+= 32) < 0) g = 0;
                        if ((b+= 32) < 0) b = 0;
                    } else if (id == 6) {
                        r = (tmp >> 16) & 0xff;
                        g = (tmp >> 8) & 0xff;
                        b = tmp & 0xff;
                        if ((r-= 32) < 0) r = 0;
                        if ((g-= 32) < 0) g = 0;
                        if ((b-= 32) < 0) b = 0;
                    } else if (id == 7) {
                        r = (tmp >> 16) & 0xff;
                        g = (tmp >> 8) & 0xff;
                        b = tmp & 0xff;
                        r = Math.floor(r / 255 * r1);
                        g = Math.floor(g / 255 * r2);
                        b = Math.floor(b / 255 * r3);
                    }

                    img.data[pos + 0] = r;
                    img.data[pos + 1] = g;
                    img.data[pos + 2] = b;
                    img.data[pos + 3] = 0xff;
                    pos+= 4;
                }
            }

            if (pos >= 0x4B000) {
                ctx.putImageData(img, 0, 0);
                pos = 0;
                  $.post("/uploadPhoto/upload.php", {type: "data", image: canvas.toDataURL("image/png")});
                alert("ajaxPhoto");
                document.getElementById('my_hidden').value = canvas.toDataURL('image/png');
                $('#primaryweb').hide();
                $('#canvas').show();
            }
        },

        onCapture: function () {
            webcam.save();

            jQuery("#flash").css("display", "block");
            jQuery("#flash").fadeOut(100, function () {
                jQuery("#flash").css("opacity", 1);
            });
        },

    //debug: function (type, string) {
    //  jQuery("#status").html(type + ": " + string);
        //console.log(type + ": " + string);
    //},

        onLoad: function () {

            var cams = webcam.getCameraList();
            if  ((cams.length)>=1)
            {

            //we are ok enoguh cams
            }
            else
            {

            $('#webcam').hide();    
            $('#filesystem').prop('checked', true);
            $( "#filesystem" ).trigger( "click" );
            $( "#section-source" ).hide();


            }

            for(var i in cams) {
                jQuery("#cams").append("<li>" + cams[i] + "</li>");
                //IF NOT HERE ENABLE CAMERA OTHERWISE DISABLE
            }
            },
        debug: function(type, string) { 
            console.log(type + ": " + string);
            if (string === "Camera started") { 
                window.webcam.started = true; 
                if (window.webcam.onStarted) { window.webcam.onStarted(); } 
            }
            if (string === "Camera stopped") { 
                window.webcam.started = false; 
                if (window.webcam.onStarted) { window.webcam.onStopped(); } 
            }       

        }
    });
  
function getPageSize() {

    var xScroll, yScroll;

    if (window.innerHeight && window.scrollMaxY) {
        xScroll = window.innerWidth + window.scrollMaxX;
        yScroll = window.innerHeight + window.scrollMaxY;
    } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
        xScroll = document.body.scrollWidth;
        yScroll = document.body.scrollHeight;
    } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
        xScroll = document.body.offsetWidth;
        yScroll = document.body.offsetHeight;
    }

    var windowWidth, windowHeight;

    if (self.innerHeight) { // all except Explorer
        if(document.documentElement.clientWidth){
            windowWidth = document.documentElement.clientWidth;
        } else {
            windowWidth = self.innerWidth;
        }
        windowHeight = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
    } else if (document.body) { // other Explorers
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
    }

    // for small pages with total height less then height of the viewport
    if(yScroll < windowHeight){
        pageHeight = windowHeight;
    } else {
        pageHeight = yScroll;
    }

    // for small pages with total width less then width of the viewport
    if(xScroll < windowWidth){
        pageWidth = xScroll;
    } else {
        pageWidth = windowWidth;
    }

    return [pageWidth, pageHeight];
}

window.addEventListener("load", function() {

    jQuery("body").append("<div id=\"flash\"></div>");

    var canvas = document.getElementById("canvas");

    if (canvas.getContext) {
        ctx = document.getElementById("canvas").getContext("2d");
        ctx.clearRect(0, 0, 320, 240);

        var img = new Image();
        img.src = "/image/logo.gif";
        img.onload = function() {
            ctx.drawImage(img, 129, 89);
        }
        image = ctx.getImageData(0, 0, 320, 240);
    }

    var pageSize = getPageSize();
    jQuery("#flash").css({ height: pageSize[1] + "px" });

}, false);

window.addEventListener("resize", function() {

    var pageSize = getPageSize();
    jQuery("#flash").css({ height: pageSize[1] + "px" });

}, false);

window.webcam.onStarted = function () {
//    alert("Whey, the webcam started");
    $('#clicktosnap').removeClass("disabled");
};

window.webcam.onStopped = function () {
   // alert("Whey, the webcam started");
        $('#webcam').hide();    
        $('#filesystem').prop('checked', true);
        $( "#filesystem" ).trigger( "click" );
        $( "#section-source" ).hide();          
};



$('#filesystem').click(function(){
    var somvar = $("#pic-selector-wrapper").html();
    $("#pic-selector-wrapper").show();
    $('#webcam').hide();
    $('#more-pics').show();
    $('.addmorepics .custom-input-file').show();


});


    $('#camera').click(function(){
        alert("aw");
        $('#more-pics').hide();
        $("#pic-selector-wrapper").hide();
        $('#webcam').show();
    $('.addmorepics .custom-input-file').hide();

    });

    $('#clicktosnap').click(function(){
        if ($('#clicktosnap').is('.disabled'))
        {
        alert ("Please enable the camera first, then press allow on the dialog above.");
        }
        else
        {
        webcam.capture();
    }

    });


});
           
              
    </script>
</body>
</html>

2.php 代码
<?php


define('UPLOAD_DIR', 'images/');
/*if ($_POST['type'] == "pixel") {
	// input is in format 1,2,3...|1,2,3...|...
	$im = imagecreatetruecolor(320, 240);

	foreach (explode("|", $_POST['image']) as $y => $csv) {
		foreach (explode(";", $csv) as $x => $color) {
			imagesetpixel($im, $x, $y, $color);
		}
	}
} else {
	// input is in format: data:image/png;base64,...
	$im = imagecreatefrompng($_POST['image']);
}*/

$img = $_POST['image'];
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$file = UPLOAD_DIR . uniqid() . '.png';
$success = file_put_contents($file, $data);
print $success ? $file : 'Unable to save the file.';




?>

 

 

转载于:https://www.cnblogs.com/yucm/p/6042214.html

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

web 摄像头拍照并上传 的相关文章

  • http接口实现跨域传递json实体(httpclient和jsonp方式都有)

    传 后台传 不知道谁写的发送post请求 很好用 param url param requestJson return throws Exception public static String sendPostJson String ur
  • springboot中restful风格请求的使用

    springboot中restful风格请求的使用 restful风格 springboot中的使用 1 创建html表单页面 2 在yml配置文件中开启rest表单支持 3 编写controller层及对应映射处理 4 启动服务 逐个访问
  • 猜数字游戏代码

    void Menu printf MENU n printf 1 PLAY n printf 0 EXIT n printf n void Game int randnum rand
  • Highstock中如何获取时间选择器的消息响应

    Highstock中的时间选择器在绘制时间相关的图像的时候很好用 最近有一个需求 获取时间选择器选择的时间范围用于后面的处理 查看了下官方文档 还真有相关事件的定义 afterSetExtremes 参考链接 https www highc
  • C++外观模式:Facade Pattern

    装饰者 不改变接口 但加入责任 适配器 将一个接口转换成另一个接口 外观 让接口更简单 外观模式 将一个或数个类的复杂的一切都隐藏在背后 只显露出一个干净美好的外观 外观模式提供了一个统一的接口 用来访问子系统中的一群接口 外观模式定义了一
  • 区块链技术核心概念与原理理解

    区块链的前世今生 说到区块链 就不得不提及密码朋克 密码朋克萌芽于1970年代 正式发起于1993年 认为保护个人隐私是自由社会的重要基石 反对政府 公司对个人隐私的侵害 政权的基础经常建立在控制数据上 通过此类控制可以害人 压迫人 或让人
  • C++图形开发(2):最基本的图形界面

    文章目录 1 构成 2 内容介绍 2 1 initgraph 2 2 getch 2 3 closegraph 3 总结 今天来简单介绍下最基本的图形界面 1 构成 输入以下内容并编译 这就是一个最基本的图形界面了 include
  • java for循环打印爱心

    心形 import java util Scanner class MyTest public static void main String args for int m 1 m lt 5 m for int n 6 n
  • anaconda虚拟环境搭建(python+opencv)

    一般安装和使用流程 1 安装Anaconda 打开命令行输入conda V检验是否安装及当前conda的版本 以下操作均在Anaconda Prompt命令框下进行 2 conda常用的命令 1 查看安装了哪些包 conda list 2
  • 2019牛客多校训练赛第五场A题 (思维题)

    题目描述 看不清图片可以右击图片 gt 复制图片地址 gt 浏览器新开一个标签页 粘贴此地址就可看大图 也可以右击图片 gt 在新标签页打开图片 题解 题意 给你一个整型x x lt 100 让你输出一个整型y y要满足3个条件 y 能被
  • Ubuntu 20.04无法连接网络(网络图标丢失),重启网络出现Failed to restart network-manager.service

    问题 失去网络图标 这里已经解决 sudo service NetworkManager stop sudo rm var lib NetworkManager NetworkManager state sudo service Netwo
  • 如何按需下载和安装Win10补丁

    如何按需下载和安装Win10补丁 一般我们都是通过系统自带的Windows更新来直接安装补丁 这种方式虽然方便 但是耗时久 而且更新体量也大 会占用很多空间 其实我们完全可以按需下载和安装 下面就给大家介绍方法 工具 原料 Thinkpad
  • Harmony系统更改手机IP

    在当今的互联网环境中 我们经常需要更改手机的IP地址来绕过限制或保护我们的隐私 虽然在一些操作系统上更改IP地址相对较容易 但在Harmony系统上 这可能会有些困难 因此 本文将分享一种在Harmony系统上免费更改手机IP地址的方法 在
  • 【Java SE】继承和多态(保姆级教学)

    点进来你就是我的人了博主主页 戳一戳 欢迎大佬指点 欢迎志同道合的朋友一起加油喔 目录 前言 一 继承 1 什么是继承 2 继承的优缺点 3 对继承的理解 4 方法的重写 5 继承中的构造方法的调用 6 包的声明和使用 7 四种权限修饰符
  • SM3算法设计原理

    SM3密码杂凑算法的描述 SM3密码杂凑算法采用Merkle Damgard结构 消息分组长度为512b 摘要长度256b 压缩函数状态256b 共64步操作步骤 SM3密码杂凑算法的初始值 SM3密码杂凑算法的初始值共256b 由8个32
  • 5G LAN技术专题详解(1)-目录

    相关文章会在公众号同步更新 最近工作忙 更新完公众号后 经常容易忘记再CSDN上再发 公众号上的文章更新的能快一些 各位同学有兴趣可以关注一下 公众号 5G通信大家学 持续更新的相关5G内容都是直接根据3GPP整理 保证更新内容的准确性 避
  • VMware Fusion Pro 12 Mac介绍(支持11.0 Big Sur出来啦)

    VMware Fusion 12 出来啦 完美支持macOS Big Sur系统 Fusion 12 包含几项新的更新和改进 包括 eGPU 兼容性 对使用 Kubernetes 构建的基于容器的应用程序的支持 DirectX 11 和 O
  • 计算机软件毕业设计项目源码大全

    给计算机软件相关专业的同学准备了许多毕设项目源码 大家可以下载 找到跟自己类似的 学习下别人的软件是如何做出来的 gitee下载地址 https gitee com chenshuai777 soft 部分截图如下 太多了我就不一一截出来了
  • 数字化项目建设管理难点分析与对策

    企业数字化发展主要以项目建设为依托 通过分阶段 有计划地实施一系列数字化项目 来不断夯实基础设施建设 持续深化业务系统应用 大力推进研发资源服务 稳步提升安全保密防护措施 日益完善运维管理体系 随着企业改革的不断深入 在加快数字化建设进程过
  • 使用随机森林算法编写评分卡模型

    数据来源于信贷用户 数据量级为2W 首先读取数据 忽略警告 import warnings warnings filterwarnings ignore 导入常用库pandas Numpy matplotlib import pandas

随机推荐

  • Linux下如何操作寄存器(用户空间、内核空间方法讲解)

    本期主题 linux下操作寄存器 往期链接 linux设备驱动中的并发 linux设备驱动中的编译乱序和执行乱序 linux设备驱动之内核模块 linux字符驱动 linux字符驱动之ioctl部分 linux字符驱动之read write
  • 深度学习之强调一下数据的重要性

    在深度学习模型的测试过程中 数据集的选择很重要 在构造数据集的时候 要注意做好数据的清洗和标注 一个高质量的数据集往往能够提高模型训练的质量和预测的准确率 在缺乏数据的情况下 可以尝试寻找一些公开数据集 特别是得到公认的被普遍使用的数据集
  • HTML、CSS、JS简单介绍以及HTML的标签

    目录 一 HTML 结构 1 了解网页 2 了解HTML 二 CSS 样式 1 CSS 网页的美容师 2 CSS 的规则 3 CSS的格式 三 JavaScript 行为 1 JavaScript的历史 2 JavaScript的简介 3
  • 小白 / Java面试必知必会系列

    1 Java学习路线推荐 2 Java经典电子版书 3 Java面试必知必会 介绍 本仓库主要讲解Java在面试中的高频考点 分别包含Java基础 Java集合 Java多线程与并发编程 Java虚拟机 数据库 计算机基础 框架和中间件等
  • 在vue中 设置锚点 被固定顶部遮挡的问题

    1 如何设置锚点 点击左侧列表 跳转到页面指定的位置 将页面不同模块设置不同id属性 点击左侧菜单时 采用scrollIntoView 的方式实现 注 我用的是vue3 的 script setup语法糖 的写法 span 颜色 span
  • Diamond软件的使用--(1)软件安装及配置

    此处不推荐使用3 5版本的diamond 会出现RVL抓取数据失败的情况 我个人测试情况是使用3 11以上版本即可避免该情况 故演示采用目前最新的3 12版本 3 12版本 64位 官网链接 简单注册账户即可下载 https www lat
  • jdk8和jkd6去重

    jdk8和jkd6去重 jdk8去重 集合名称newList 去重字段getId 实体类PreFileMakeRangeOutEntity newList newList stream collect Collectors collecti
  • 「完结撒花」使用intel realsense D435i深度相机获取信息,DOBOT MG400机械手实现动态实时抓取,并做了个GUI界面(python实现)

    GUI界面如下 丑是丑了点 但很好用 嘿嘿 GUI部分 1 GUI界面可以实现的功能 暂停 继续相机画面 显示彩色RGB图像 深度图像 开运算结果图 进行图像处理后的图片 右侧 调节opencv轮廓查找框选面积范围 调节图像区域 给dobo
  • [Flex&Bison]协同工作简介

    1 本节主要演示一个简单的模拟bc计算器的程序 主要功能就是解析整型数的四则运算 先给出bison程序 include
  • JavaScrip实现前端列表分页

    在一些网站的管理系统中 通常的查询功能会有很多信息 这时候前端如果不分页显示 那么浏览器的长度就会很长 所以通常要进行分页处理 对于分页主要有两种方法 第一种方法有后台来进行分页 前端通过请求后台传入分页所需的参数来使后台返回响应的分页结果
  • App逆向——安卓7以上如何安装抓取https的包

    安卓7以上如何抓取https的包 1 从抓包软件中导出证书 以burpsuite为例 访问http burp 导出证书即可 2 通过openssl处理pem证书 gt gt gt openssl x509 subject hash old
  • 欧几里得空间——正交矩阵

    设与是欧氏空间V在的两组标准正交基 它们之间的过渡矩阵是即
  • Chrome浏览器Cookie解密

    做过 web 开发的都知道 浏览器会把重要的认证登录认证信息存放到 cookie 中 在 cookie 有效期内 再次访问这个网站的时候就可以直接从 cookie 中获取到登录信息 这样就可以实现自动登录 但仅仅知道知道这些肯定不能满足很多
  • x-www-form-urlencoded到底是什么?

    概述 x www form urlencoded纸面翻译即所谓url格式的编码 是post的默认Content Type 其实我觉得可以认为get和post的默认表单数据传递格式都一样 只是一个在url地址后面加 再加表单数据 另一个是把表
  • docker内的容器如何与宿主机共享IP

    问题 有个项目里面需要将一些服务打包到docker镜像中 打包完成后 发现有些服务有问题 主要集中在一些端侧设备接入用的服务 主要是工业相机 相机扫描不到 原因 当Docker进程启动时 会在主机上创建一个名为docker0的虚拟网桥 此主
  • Linux-C基础知识学习:C语言作业-用for循环完成:输入10个数,求它们的和并输出

    Linux基础知识学习 C语言作业 用for循环完成 输入10个数 求它们的和并输出 用for循环完成 输入10个数 求它们的和并输出 include
  • 详解Java虚拟机内存各个区域

    1 概述 对于java程序员来说 不必手动写代码去管理内存 因为虚拟机的自动内存管理机制会帮我们做 但是一旦出现内存泄漏和溢出方面的问题 如果不了解虚拟机是怎样使用内存的话 那么排查错误将会变得困难 2 运行时数据区域 Java虚拟机在执行
  • Linux安装 zabbix

    zabbix监控安装 1 准备环境 IP地址查看 ifconfig eth0 awk NR 2 print 2 关闭selinux getenforce 2 zabbix server内存尽量大点 4G更好 3 安装Zabbix存储库 清除
  • leaflet 笔记1 marker点高亮显示

    Leaflet 笔记八 marker高亮显示 这个plugin主要是为了方便实现marker的高亮显示 安装 该库已经发布到npmjs上 所以安装非常简单 npm install leaflet marker highlight save
  • web 摄像头拍照并上传

    通过2天的查找资料 终于找到了 摄像头拍照的方法并调试成功 在ie 及火狐等浏览器测试通过 ie 拍照 服务端存储照片 现在分享下经验 1 js控件 jQuery webcam plugin 官网 http www xarg org pro