一切皆可抽象

          大而無形 庖丁解牛 厚積薄發 滌慮玄覽
             ::  ::  ::  ::  :: 管理

          【轉貼】利用JMF進行攝像頭拍照

          Posted on 2005-10-13 09:11 鋒出磨礪 閱讀(417) 評論(0)  編輯  收藏 所屬分類: java算法
          首先到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");



          }




          主站蜘蛛池模板: 紫阳县| 慈溪市| 宝应县| 永安市| 潢川县| 巴林左旗| 汕头市| 阿合奇县| 韶山市| 视频| 佛冈县| 上杭县| 虞城县| 开封县| 丽江市| 东丰县| 红河县| 察哈| 曲水县| 靖远县| 准格尔旗| 黔江区| 孟津县| 景德镇市| 化州市| 衡阳市| 扶余县| 利川市| 杭锦后旗| 句容市| 鄂伦春自治旗| 九龙县| 虎林市| 福安市| 昭觉县| 太仓市| 青海省| 石家庄市| 古浪县| 新昌县| 长垣县|