如何使用HTML5实现利用摄像头拍照上传功能(java版)

RF:   http://blog.csdn.net/lulu11231123/article/details/52181354

前台:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml">   
    <head>   
        <title></title>   
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   
          <script type="text/javascript" src="../resource/js/jquery/jquery-2.2.3.js"></script>
    </head>   
   
    <body>   
  <div id="contentHolder">
    <video id="video" width="320" height="320" autoplay></video>
    <button id="picture" style="display:block" >拍照</button>
    <canvas style="display:block" id="canvas" width="320" height="320"></canvas>
    <button id="sc" style="display:block" >上传</button>
</div>
<script>
    navigator.getUserMedia = navigator.getUserMedia ||
    navigator.webkitGetUserMedia ||
    navigator.mozGetUserMedia;
    if (navigator.getUserMedia) {
        navigator.getUserMedia({ audio: true, video: { width: 320, height: 320 } },
                function(stream) {
                    var video = document.getElementById("video");
                    video.src = window.URL.createObjectURL(stream);
                    video.onloadedmetadata = function(e) {
                        console.log('nihao44eee4aaaaddda');
                        video.play();
                    };
                },
                function(err) {
                    console.log("The following error occurred: " + err.name);
                }
        );
    } else {
        console.log("getUserMedia not supported");
    }
  
   
    document.getElementById("picture").addEventListener("click", function () {
    	  debugger;
    	 var context = document.getElementById("canvas").getContext("2d");
        context.drawImage(video, 0, 0, 320, 320);
    });
    document.getElementById("sc").addEventListener("click", function () {
        var imgData=document.getElementById("canvas").toDataURL("image/png");
        var data=imgData.substr(22);
        debugger;
        console.log(data);
        $.post('../upload/sc',{'sj':data});
    });
</script>
    </body>   
</html>  


后台:

 @RequestMapping(value = "/sc", method = RequestMethod.POST)
    @ResponseBody
    public String sc(HttpServletResponse response,HttpServletRequest request,String sj) throws Exception {
        GenerateImage(sj);
        return "sxt";
    }
    // base64字符串转化成图片
    public static boolean GenerateImage(String imgStr) { // 对字节数组字符串进行Base64解码并生成图片
        if (imgStr == null) // 图像数据为空
            return false;
       
        try {
           // Base64解码
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] bytes = decoder.decodeBuffer(imgStr);


           // byte[] bytes = Base64.decodeBase64(imgStr);   //或用Base64 解   org.apache.commons.codec.binary.Base64;


            for (int i = 0; i <bytes.length; ++i) {
                if (bytes[i] < 0) {// 调整异常数据
                    bytes[i] += 256;
                }
            }
// 生成jpeg图片
            String imgFilePath = "F:/test22.png";// 新生成的图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(bytes);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }


首先到sun下载最新的jmf,然后安装。http://java.sun.com/products/java-media/jmf/index.jsp   然后,说一下需求   1. 用摄像头拍照   2. 在文本框输入文件名   3. 按下拍照按钮,获取摄像头内的图像   4. 在拍下的照片上有一红框截取固定大小的照片。   5. 保存为本地图像为jpg格式,不得压缩画质   技术关键,相信也是大家最感兴趣的部分也就是如何让一个摄像头工作,并拍下一张照片了。 --------------------------------------------------------------------------------------------------------------   利用jmf,代码很简单: //利用这三个类分别获取摄像头驱动,和获取摄像头内的图像流,获取到的图像流是一个swing的component组件类 public static player player = null; private capturedeviceinfo di = null; private medialocator ml = null; //文档中提供的驱动写法,为何这么写我也不知:) string str1 = "vfw:logitech usb video camera:0"; string str2 = "vfw:microsoft wdm image capture (win32):0"; di = capturedevicemanager.getdevice(str2); ml = di.getlocator(); try {  player = manager.createrealizedplayer(ml);  player.start();  component comp;  if ((comp = player.getvisualcomponent()) != null)  {   add(comp, borderlayout.north);  } } catch (exception e) {  e.printstacktrace(); }   接下来就是点击拍照,获取摄像头内的当前图像。   代码也是很简单: private jbutton capture; private buffer buf = null; private buffertoimage btoi = null; private imagepanel imgpanel = null; private image img = null; private imagepanel imgpanel = null; jcomponent c = (jcomponent) e.getsource(); if (c == capture)//如果按下的是拍照按钮 {  framegrabbingcontrol fgc =(framegrabbingcontrol)  player.getcontrol("javax.media.control.framegrabbingcontrol");  buf = fgc.grabframe(); // 获取当前祯并存入buffer类  btoi = new buffertoimage((videoformat) buf.getformat());  img = btoi.createimage(buf); // show the image  imgpanel.setimage(img); }   保存图像的就不多说了,以下为示例代码 bufferedimage bi = (bufferedimage) createimage(imgwidth, imgheight); graphics2d g2 = bi.creategraphics(); g2.drawimage(img, null, null); fileoutputstream out = null; try {  out = new fileoutputstream(s); } catch (java.io.filenotfoundexception io) {  system.out.println("file not found"); } jpegimageencoder encoder = jpegcodec.createjpegencoder(out); jpegencodeparam param = encoder.getdefaultjpegencodeparam(bi); param.setquality(1f, false);//不压缩图像 encoder.setjpegencodeparam(param); try {  encoder.encode(bi);  out.close(); } catch (java.io.ioexception io) {  system.out.println("ioexception"); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值