JAVA B/S通过摄像头采集图片信息解决方案。

在浏览器上调用摄像头。有ACTIVX,FLASH,HTML5,JAVA的。其中ACTIVEX只支持IE不去考虑,HTML5低版本浏览器不支持同样放弃,剩下只有FLASH了。JAVA要重新开发,没时间。网上找了很久,终于找到一个JQUERY的插件可以实现调动视频。上代码:

1.官网下载相关文件

http://www.xarg.org/project/jquery-webcam-plugin/

2.前端脚步:

<script>
$(function() {
    var swfpah="${pageContext.request.contextPath}/resources/plugins/jQuery-webcam-master/jscam_canvas_only.swf";//FLASH连接
    var pos = 0, ctx = null, saveCB, image = [];
     var w=320;
     var h=240;
    var canvas = document.createElement("canvas");
    canvas.setAttribute(‘width‘, w);
    canvas.setAttribute(‘height‘, h);

    if (1==0&&canvas.toDataURL) {//支持HTML5时候用
debugger;
        ctx = canvas.getContext("2d");
        image = ctx.getImageData(0, 0, w, h);
        saveCB = function(data) {//会循环调用该方法直到读完每行,data是一行的坐标。
            var col = data.split(";");
            var img = image;
            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;
            }
            if (pos >= 4 * w * h) {
                ctx.putImageData(img, 0, 0);
                $.ajax({
                    url : "../test2/video",
                    dataType : "json",
                    type : ‘post‘,
                    data:{
                        type: "data",
                        image: canvas.toDataURL("image/png")
                    },
                    error:function(e)
                    {
                    },
                    beforeSend:function(){
                        layer.load();
                    },
                    complete:function(){
                        layer.closeAll(‘loading‘);
                    },
                    success : function(url) {
                        $(‘#myImg‘).attr(‘src‘,url);
                    }
                })
            //    $.post("../test2/video?tmp=" + Math.random(), {type: "data", image: canvas.toDataURL("image/png")},function(url)
            //            {
            //        $(‘#myImg‘).attr(‘src‘,url);
            //        },"json");
                pos = 0;
            }
        };

    } else {
        saveCB = function(data) {//循环调用该方法
            image.push(data);
            pos+= 4 * w;
            if (pos >= 4 * w * h) {
                $.ajax({
                    url : "../test2/video",
                    dataType : "json",
                    type : ‘post‘,
                    data:{
                        type: "pixel",
                        image: image.join(‘|‘),
                        w:w,
                        h:h
                    },
                    error:function(c)
                    {
                    },
                    beforeSend:function(){
                        layer.load();
                    },
                    complete:function(){
                        layer.closeAll(‘loading‘);
                    },
                    success : function(url) {
                        $(‘#myImg‘).attr(‘src‘,url);
                    }
                })
            //    $.post("../test2/video", {type: "pixel", image: image.join(‘|‘),w:w,h:h},function(url)
            //            {
            //        alert(url);
            //        $(‘#myImg‘).attr(‘src‘,url);
            //            },"json");
                pos = 0;
            }
        };
    }

    $("#webcam").webcam({
        width: w,
        height: h,
        mode: "callback",
        swffile: swfpah,
        onSave: saveCB,
        onCapture: function () {
            webcam.save();
        },
        debug: function (type, string) {
            console.log(type + ": " + string);
        },
        onLoad: function() {
            $(‘#test‘).bind(‘click‘,function(){
                webcam.capture();
            });
        }
    });
});

 </script> 

HTML代码:

 1 <div id="webcam">
 2    </div>
 3    <a href="javascript:webcam.capture();void(0);">Take a picture instantly</a>
 4    <input id="test" type="button" value="test" />
 5    <img id="myImg" alt="" src="">
 6
 7 //webcam 加载成功后会有一个全局对象webcam。该对象内在方法:
 8 capture([delay])
 9 Captures an image internally.
10 save([file])
11 Saves the captured image accordingly to the storage mode.
12 getCameraList()
13 Get‘s an array of available cameras. If no camera is installed, an error is thrown and an empty array is returned.
14 setCamera([index])
15 Switches to a different camera. The parameter is the index of the element in the resulting array of getCameraList()

JAVA后台代码:

@RequestMapping(value = "/video", method = RequestMethod.POST)
        public @ResponseBody String video2(HttpServletRequest request, HttpServletResponse response) throws  IOException, DocumentException {
            String lx = request.getParameter("type");
            String image = request.getParameter("image");

if(StringUtils.isEmpty(lx))
               return "";
        String image = request.getParameter("image");
        if(StringUtils.isEmpty(image))
          return "";

boolean r=false;
            String uuid= UUID.randomUUID().toString();
            String url = request.getContextPath() + "\\resources\\PDF\\tmp\\" + uuid + ".png";
         String outpath =  request.getRealPath("/") + "\\resources\\PDF\\tmp\\" + uuid + ".png";
            if(lx.equals("data"))
            {
                r=base64ToImg(image, outpath);
            }
            if(lx.equals("pixel"))
            {
                String w = request.getParameter("w");
                String h= request.getParameter("h");
                r=base32ToImg(w,h,image,outpath);
            }
            if(r)
            return url;
            else
            return "";
     }

@SuppressWarnings("restriction")//解析64位格式的
public boolean base64ToImg(String imgStr, String imgFilePath) {
        if (imgStr == null) {
            return false;
        }
        imgStr=imgStr.replace("data:image/png;base64,", "").trim();
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            byte[] bytes = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < bytes.length; ++i) {
                if (bytes[i] < 0) {// 调整异常数据
                    bytes[i] += 256;
                }
            }
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(bytes);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
}
//解析普通坐标数组的
public boolean base32ToImg(String width,String height,String imgStr,String imgFilePath) {
     if (imgStr == null) {
         return false;
     }
    int w = Integer.parseInt(width);
    int h = Integer.parseInt(height);
    try {
        BufferedImage bf = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        String[] rows = imgStr.split("\\|");
        for (int i = 0; i < rows.length; i++) {
            String[] col = rows[i].split(";");
            for (int j = 0; j < col.length; j++) {
                int data = Integer.parseInt(col[j], 10);
                bf.setRGB(j, i, data);
            }
        }
     File outfile=   new File(imgFilePath);
     if (outfile.exists()) {
         outfile.delete();
     }
        ImageIO.write(bf, "png", outfile);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}
时间: 2024-12-23 00:41:27

JAVA B/S通过摄像头采集图片信息解决方案。的相关文章

OpenCV 入门级之USB摄像头采集[转]

前面两篇博文呢,介绍了 OpenCV 的环境搭配以及最基本的几个函数的使用, 而这一篇博文则还是延续以 Demo 讲述 OpenCV API 的方式, 因为有些 API 是用得很多的,所以必须要熟练,而至于其他的一些比较罕见的 API , 则可以通过在 OpenCV 官网上下载必要的 API 文档来熟悉就 OK 了, 对于在前面呢,基本上介绍了 IplImage 以及 CvCapture 的使用,下面的 Demo 呢, 其实和前面差不多,只不过,我是通过摄像设备捕捉到帧后进行的处理, 其实这个并

基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)

基于opencv和mfc的摄像头采集框架(GOMFCTemplate2) 编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的. 基于现有资料,通过在实际项目中的积累,我总结出来一套结合opencv和mfc的摄像头采集框架.具有以下特点: 1.基于directshow,兼容性好,速度快.到目前为止,无论是工业相机还是普通相机,没发现不兼容的: 2.摄像头部分通过线程读取,保证界面的运行流畅:

Android摄像头采集的视频数据流如何通过Socket实时发送到目标服务端

分两块: 1.取得摄像头采集的视频流 2.发送到服务器端 protected MediaRecorder mMediaRecorder; private LocalServerSocket mLss = null; private LocalSocket mReceiver, mSender = null; mLss = new LocalServerSocket("myVideoStream"); mReceiver = new LocalSocket(); //连接mLss,即接受

java微服务架构的分布式事务解决方案

java微服务架构的分布式事务解决方案 课程目录如下: 1.课程介绍20分钟2.解决方案的效果演示(结合支付系统真实应用场景)45分钟3.常用的分布式事务解决方案介绍47分钟4.消息发送一致性(可靠消息的前提保障)20分钟5.消息发送一致性的异常流程处理16分钟6.常规MQ队列消息的处理流程和特点12分钟7.消息重复发送问题及业务接口的幂等性设计18分钟8.可靠消息最终一致性方案1(本地消息服务)的设计19分钟9.可靠消息最终一致性方案2(独立消息服务)的设计24分钟10.可靠消息服务的设计与实

Ant学习-001-ant 执行 TestNG 测试用例时 [testng] java.lang.NoClassDefFoundError: com/beust/jcommander/ParameterException 解决方案

Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 在日常的 Java 开发应用中,使用较为广泛(类似的项目构建工具还有 maven,感兴趣的可自行了解),同时也多是持续集成框架中的组成成员,因打算打造自己的自动化测试集成框架,因而今天尝试了一下(感谢大神 伟神 提供的 build.xml 文件和此过程中的远程支持,非常感谢!) 今天学习 ant 构建应用,通过 ant 执行 TestNG 测

Java多线程学习幸运飞艇采集器修复

package javastudy01; class MyThread extends Thread {//重写Run方法public void run(){//1.获取当前线程的名字System.out.println(this.getName()+"我是一个线程."); } public static void main(String[] args) {Java多线程学习幸运飞艇采集器修复,需要请搜索[大神源码论坛]dsluntan.com 客服企娥3393756370 V信170

Java 出现内存溢出的定位以及解决方案

在上一节中Java虚拟机内存分布   说了Java虚拟机中分为五个区域,而且也知道了在Java程序计数器区域不会出现OOM(OutOfMemeryError),那么以下就对除了程序计数器以外的四个区域出现OOM的原理以及解决方案进行解说. 1.Java虚拟机栈与本地方法栈 栈的大小控制參数时 -Xss. Java虚拟机在栈中定义了两种异常,StrackOverFlowError和OutOfMemeryError.当请求栈的深度大于java虚拟机所同意的最大深度则抛出StrackOverFlowE

图片缩放时java.lang.IllegalArgumentException: pointerIndex out of range解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载. 06-03 20:45:24.143: E/AndroidRuntime(1230): FATAL EXCEPTION: main06-03 20:45:24.143: E/AndroidRuntime(1230): java.lang.IllegalArgumentException: pointerIndex out of range06-03 20:45:24.143: E/AndroidRuntime(1230): at androi

Java转iOS-遇到的问题和解决方案

遇到问题和解决方案 ? ? 本文是Java转iOS-第一个项目总结的内容补充,分析遇到的一些问题和解决方案,分享一些收获. 1.UITableView滑动卡顿的优化 ? ?因为 UITableView的cell中有很多图片,在4/4s上滑动比较卡,最开始觉得是机器太老了,但是对比微信和QQ空间,发现还是我们的问题,所以后期进行了优化,通过xcode的性能监控,内存变化不大,但是cpu飙升的俩厉害,通过xcode的Time Profiler工具进行了监控(Product-Profile-Time