首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Media Framework (JMF) 實作攝影機拍照程式完整教學

     編輯:Java 相關知識

利用 Java Media Framework (JMF) 開發攝影機拍照應用,可滿足現場拍照、生成照片等需求。本文詳細說明從環境建置、攝影機畫面擷取、固定區域裁切、到高畫質 JPEG 儲存的完整流程。

環境準備

  1. 下載並安裝最新版 JMF:官方下載頁
  2. 確認攝影機驅動已正確安裝於作業系統。

核心需求

  • 啟動攝影機並顯示即時畫面
  • 提供檔名輸入欄位
  • 按下拍照按鈕擷取當前畫面
  • 於畫面上顯示紅框,裁切固定尺寸區域
  • 儲存為無損畫質 JPEG 檔案

關鍵技術:啟動攝影機與取得畫面元件

JMF 透過 CaptureDeviceManager 取得裝置資訊,建立 Player 播放器,並從中取得視覺元件 (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 = player.getVisualComponent();
    if (comp != null) {
        add(comp, BorderLayout.NORTH);
    }
} catch (Exception e) {
    e.printStackTrace();
}

擷取當前影像 (拍照功能)

透過 FrameGrabbingControl 取得當前幀緩衝區 (Buffer),轉換為 Image 物件。

private JButton capture;
private Buffer buf = null;
private BufferToImage btoi = null;
private ImagePanel imgpanel = null;
private Image img = null;

// 事件處理中
JComponent c = (JComponent) e.getSource();
if (c == capture) {
    FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
    buf = fgc.grabFrame();
    btoi = new BufferToImage((VideoFormat) buf.getFormat());
    img = btoi.createImage(buf);
    imgpanel.setImage(img); // 顯示於自訂面板
}

固定區域裁切與無損儲存 JPEG

建立 BufferedImage 繪製裁切區域,使用 JPEGImageEncoder 設定品質參數 1.0f (無壓縮) 輸出。

BufferedImage bi = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bi.createGraphics();
g2.drawImage(img, 0, 0, imgWidth, imgHeight, cropX, cropY, cropX + imgWidth, cropY + imgHeight, null);
g2.dispose();

FileOutputStream out = new FileOutputStream(filename);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1f, false); // 不壓縮
encoder.setJPEGEncodeParam(param);
encoder.encode(bi);
out.close();

後續擴展建議

已將專案 JWebCam 申請為開源專案,歡迎開發者加入影片錄製、影像處理、濾鏡特效等功能,發揮創意。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved