一切皆可抽象

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

          【轉貼】利用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");



          }




          主站蜘蛛池模板: 类乌齐县| 四川省| 桃园县| 军事| 乌恰县| 滨州市| 余干县| 翁牛特旗| 即墨市| 高碑店市| 绥德县| 文化| 手游| 隆尧县| 株洲县| 通许县| 浮梁县| 天津市| 墨玉县| 清新县| 乐昌市| 阿拉善盟| 阿克陶县| 琼结县| 龙州县| 神池县| 灵山县| 山阴县| 吐鲁番市| 远安县| 旅游| 新干县| 蕉岭县| 彭阳县| 南皮县| 信丰县| 沂南县| 焦作市| 和林格尔县| 鹤庆县| 浪卡子县|