本人现在做一个学籍管理系统:
想做到:在一个JSP页面中,有个小窗口可以使用摄像头看到学生,并在学生摆正姿势后,点击一个按钮,把他(她)的照片拍下,点击保存保存在该学生的学籍中。
(就像计算机一级考试那个现场数码照像)
请问:怎么解决?
谢谢!!!

解决方案 »

  1.   

    JNI???
    能给一小段代码吗?
      

  2.   

    从Java来做这个, 我觉得有难度...应该是从驱动下手吧
      

  3.   

    http://community.csdn.net/Expert/topic/5425/5425514.xml?temp=.311886
    看看这个里面
      

  4.   

    using   System;   
      using   System.Drawing;   
      using   System.Collections;   
      using   System.ComponentModel;   
      using   System.Windows.Forms;   
      using   System.Data;   
      using   System.Runtime.InteropServices;   
      using   System.Drawing.Imaging;   
        
      namespace   CapTureMovie   
      {   
      ///   <summary>   
      ///   Form1   的摘要说明。   
      ///   </summary>   
      public   class   Form1   :   System.Windows.Forms.Form   
      {   
      private   System.Windows.Forms.Button   BtnCapTure;   
      private   System.Windows.Forms.Panel   panel_Vedio;   
      private   int   hHwnd;   
      private   System.Windows.Forms.Button   BtnStop;   
      private   System.Windows.Forms.Label   LbSysMsg;   
      private   System.Windows.Forms.Button   button1;   
        
      public   struct   videohdr_tag   
      {   
      public   byte[]   lpData;   
      public   int   dwBufferLength;   
      public   int   dwBytesUsed;   
      public   int   dwTimeCaptured;   
      public   int   dwUser;   
      public   int   dwFlags;   
      public   int[]   dwReserved;     
        
      }   
      public   delegate   bool   CallBack(int   hwnd,   int   lParam);     
      ///   <summary>   
      ///   必需的设计器变量。   
      ///   </summary>   
      private   System.ComponentModel.Container   components   =   null;   
      [DllImport("avicap32.dll",   CharSet=CharSet.Ansi,   SetLastError=true,   ExactSpelling=true)]   
      public   static   extern   int   capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)]   ref   string   lpszWindowName,   int   dwStyle,   int   x,   int   y,   int   nWidth,   short   nHeight,   int   hWndParent,   int   nID);   
      [DllImport("avicap32.dll",   CharSet=CharSet.Ansi,   SetLastError=true,   ExactSpelling=true)]   
      public   static   extern   bool   capGetDriverDescriptionA(short   wDriver,   [MarshalAs(UnmanagedType.VBByRefStr)]   ref   string   lpszName,   int   cbName,   [MarshalAs(UnmanagedType.VBByRefStr)]   ref   string   lpszVer,   int   cbVer);   
      [DllImport("user32",   CharSet=CharSet.Ansi,   SetLastError=true,   ExactSpelling=true)]   
      public   static   extern   bool   DestroyWindow(int   hndw);   
      [DllImport("user32",   EntryPoint="SendMessageA",   CharSet=CharSet.Ansi,   SetLastError=true,   ExactSpelling=true)]   
      public   static   extern   int   SendMessage(int   hwnd,   int   wMsg,   int   wParam,   [MarshalAs(UnmanagedType.AsAny)]   object   lParam);   
      [DllImport("user32",   CharSet=CharSet.Ansi,   SetLastError=true,   ExactSpelling=true)]   
      public   static   extern   int   SetWindowPos(int   hwnd,   int   hWndInsertAfter,   int   x,   int   y,   int   cx,   int   cy,   int   wFlags);   
      [DllImport("vfw32.dll")]   
      public   static   extern   string   capVideoStreamCallback(int   hwnd,videohdr_tag   videohdr_tag);   
      [DllImport("vicap32.dll",   CharSet=CharSet.Ansi,   SetLastError=true,   ExactSpelling=true)]   
      public   static   extern   bool   capSetCallbackOnFrame(int   hwnd,string   s);   
        
      public   Form1()   
      {   
      //   
      //   Windows   窗体设计器支持所必需的   
      //   
      InitializeComponent();   
        
      //   
      //   TODO:   在   InitializeComponent   调用后添加任何构造函数代码   
      //   
      }   
        
      ///   <summary>   
      ///   清理所有正在使用的资源。   
      ///   </summary>   
      protected   override   void   Dispose(   bool   disposing   )   
      {   
      if(   disposing   )   
      {   
      if   (components   !=   null)     
      {   
      components.Dispose();   
      }   
      }   
      base.Dispose(   disposing   );   
      }   
      

  5.   

    #region   Windows   窗体设计器生成的代码   
      ///   <summary>   
      ///   设计器支持所需的方法   -   不要使用代码编辑器修改   
      ///   此方法的内容。   
      ///   </summary>   
      private   void   InitializeComponent()   
      {   
      System.Resources.ResourceManager   resources   =   new   System.Resources.ResourceManager(typeof(Form1));   
      this.panel_Vedio   =   new   System.Windows.Forms.Panel();   
      this.BtnCapTure   =   new   System.Windows.Forms.Button();   
      this.BtnStop   =   new   System.Windows.Forms.Button();   
      this.LbSysMsg   =   new   System.Windows.Forms.Label();   
      this.button1   =   new   System.Windows.Forms.Button();   
      this.SuspendLayout();   
      //     
      //   panel_Vedio   
      //     
      this.panel_Vedio.BackgroundImage   =   ((System.Drawing.Image)(resources.GetObject("panel_Vedio.BackgroundImage")));   
      this.panel_Vedio.BorderStyle   =   System.Windows.Forms.BorderStyle.Fixed3D;   
      this.panel_Vedio.Location   =   new   System.Drawing.Point(8,   16);   
      this.panel_Vedio.Name   =   "panel_Vedio";   
      this.panel_Vedio.Size   =   new   System.Drawing.Size(288,   224);   
      this.panel_Vedio.TabIndex   =   0;   
      //     
      //   BtnCapTure   
      //     
      this.BtnCapTure.Location   =   new   System.Drawing.Point(24,   256);   
      this.BtnCapTure.Name   =   "BtnCapTure";   
      this.BtnCapTure.TabIndex   =   1;   
      this.BtnCapTure.Text   =   "图象采集";   
      this.BtnCapTure.Click   +=   new   System.EventHandler(this.BtnCapTure_Click);   
      //     
      //   BtnStop   
      //     
      this.BtnStop.Enabled   =   false;   
      this.BtnStop.Location   =   new   System.Drawing.Point(136,   256);   
      this.BtnStop.Name   =   "BtnStop";   
      this.BtnStop.TabIndex   =   1;   
      this.BtnStop.Text   =   "停止采集";   
      this.BtnStop.Click   +=   new   System.EventHandler(this.BtnStop_Click);   
      //     
      //   LbSysMsg   
      //     
      this.LbSysMsg.Location   =   new   System.Drawing.Point(16,   296);   
      this.LbSysMsg.Name   =   "LbSysMsg";   
      this.LbSysMsg.Size   =   new   System.Drawing.Size(240,   23);   
      this.LbSysMsg.TabIndex   =   2;   
      //     
      //   button1   
      //     
      this.button1.Location   =   new   System.Drawing.Point(304,   48);   
      this.button1.Name   =   "button1";   
      this.button1.TabIndex   =   3;   
      this.button1.Text   =   "button1";   
      this.button1.Click   +=   new   System.EventHandler(this.button1_Click);   
      //     
      //   Form1   
      //     
      this.AutoScaleBaseSize   =   new   System.Drawing.Size(6,   14);   
      this.ClientSize   =   new   System.Drawing.Size(400,   357);   
      this.Controls.Add(this.button1);   
      this.Controls.Add(this.LbSysMsg);   
      this.Controls.Add(this.BtnCapTure);   
      this.Controls.Add(this.panel_Vedio);   
      this.Controls.Add(this.BtnStop);   
      this.Name   =   "Form1";   
      this.Text   =   "Form1";   
      this.ResumeLayout(false);   
        
      }   
      #endregion   
        
      ///   <summary>   
      ///   应用程序的主入口点。   
      ///   </summary>   
      [STAThread]   
      static   void   Main()     
      {   
      Application.Run(new   Form1());   
      }   
        
      private   void   BtnCapTure_Click(object   sender,   System.EventArgs   e)   
      {   
      this.OpenCapture();   
        
      }   
      private   void   OpenCapture()   
      {   
        
      int   intWidth=this.panel_Vedio.Width;   
      int   intHeight=this.panel_Vedio.Height;   
      int   intDevice=0;   
      string   refDevice=intDevice.ToString();   
      hHwnd=Form1.capCreateCaptureWindowA(ref   refDevice,1342177280,0,0,640,480,this.panel_Vedio.Handle.ToInt32(),0);   
      this.LbSysMsg.Text="";   
      this.LbSysMsg.Text+="驱动:"+refDevice;   
      if(Form1.SendMessage(hHwnd,0x40a,intDevice,0)>0)   
      {   
      Form1.SendMessage(this.hHwnd,0x435,-1,   0);   
      Form1.SendMessage(this.hHwnd,0x434,0x42,   0);   
      Form1.SendMessage(this.hHwnd,0x432,-1,   0);   
      Form1.SetWindowPos(this.hHwnd,1,0,0,intWidth,intHeight,6);   
      this.BtnCapTure.Enabled=false;   
      this.BtnStop.Enabled=true;   
      }   
      else   
      {   
      Form1.DestroyWindow(this.hHwnd);   
      this.BtnCapTure.Enabled=false;   
      this.BtnStop.Enabled=true;   
      }   
      }   
        
      private   void   BtnStop_Click(object   sender,   System.EventArgs   e)   
      {   
      Form1.SendMessage(this.hHwnd,   0x40b,   0,   0);   
      Form1.DestroyWindow(this.hHwnd);   
      this.BtnCapTure.Enabled=true;   
      this.BtnStop.Enabled=false;   
      }   
        
      private   void   button1_Click(object   sender,   System.EventArgs   e)   
      {   
      try   
      {   
      Form1.SendMessage(this.hHwnd,0x41e,0,0);   
      IDataObject   obj1   =   Clipboard.GetDataObject();   
      if   (obj1.GetDataPresent(typeof(Bitmap)))   
      {   
                                          Image   image1   =   (Image)   obj1.GetData(typeof(Bitmap));   
                                        //   this.panel_Vedio.Image   =   image1;   
                                        //   this.ClosePreviewWindow();   
                                            
          SaveFileDialog   SaveFileDialog1=new   SaveFileDialog();   
                                          if   (SaveFileDialog1.ShowDialog()   ==   DialogResult.OK)   
                                          {   
                                                      image1.Save(SaveFileDialog1.FileName,   ImageFormat.Bmp);   
                                          }   
        }   
      }   
      catch   
      {   
      }   
      }   
      }   
      } 
    两段加起来,但不是java的
      

  6.   

    首先到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");
    }
      

  7.   


     上面
     那位哥们
     写了这么多?
     可惜不是JSP的
     汗~~~
    是C#的
      

  8.   

    adverse(King) 兄弟的JMF,很不错。
    能不能写的祥细点。比如:把包引入什么的都写一下。谢谢!^_^
      

  9.   

    以前用delphi实现过
    调用delphi封装好了的 vfwjava不会
      

  10.   

    把.jar文件导入。下载了jmf后需要安装,安装后你的那个jmf目录下就会有一个lib文件夹里面有.jar文件,然后打开eclipse,右键选择你的工程-〉属性-〉java build path->library-〉add external jars 找到你的jmf目录下lib的那个文件夹然后选中那些文件导入就ok了。
    然后利用工具提供的导入文件帮助,一个一个导就OK了
      

  11.   

    jsp不可能实现的,jsp是服务器端的,实现楼主的功能如果非要用java,可以用applet
      

  12.   

    我们与前做过。是自学考试的报名系统。J2EE 平台。如 liu_an(从来不上网) 说的 需要 applet。J2EE 是在服务器运行的与你的客户端无关。建意你如果客户端是MS 的 用 ActiveX 会好一点。
      

  13.   

    哎, jsp里就是能实现也是调服务器端的摄想头。劝你换路子,考虑下flash com之类的吧, 只要客户装了flash就可以实现这个功能。用java实现你的想法,不现实
      

  14.   

    可能楼上有位的JMF才好用吧,用JAVA窗体可能好一些。WEB的就不用考虑了
      

  15.   

    可以考虑用delphi之类的写一个程序。
    然后通过JNI调用。