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

Windows 8 擷取照片與影片完整指南:CameraCaptureUI 高階用法與 MediaCapture 選擇策略

     編輯:關於.NET

前言:相機是行動裝置最核心感測器,API 選擇決定開發效率與體驗上限

Windows 8 提供兩套相機 API:**`CameraCaptureUI` (高階、系統 UI、零配置)** 與 **`MediaCapture` (低階、自訂 UI、完全控制)**。本文深度解析 `CameraCaptureUI` 的全螢幕拍攝體驗、內建編輯、設定面板,並給出何時必須升級 `MediaCapture` 的決策矩陣。

一、CameraCaptureUI:開箱即用的完整拍攝體驗

1. 核心特性

  • 系統全螢幕 UI:觸控優化、自動適配裝置方向、無需自行設計預覽畫面。
  • 內建編輯器:拍照後可 **裁剪** (比例鎖定/自由)、錄影後可 **剪輯** (設定起迄點)、重拍/確認流程完整。
  • 豐富設定面板:解析度、防震動、亮度、對比度、曝光、白平衡、對焦模式 (自動/單次/連續/手動)。
  • 非同步單一 API**:`CaptureFileAsync(CameraCaptureUIMode)` 回傳 `StorageFile`,極簡介面。

2. 權限宣告 (Package.appxmanifest → Capabilities)

  • 拍照:勾選 **Webcam**。
  • 錄影:勾選 **Webcam** + **Microphone**。

Webcam權限

Microphone權限

3. 設定屬性總覽

照片設定 (`PhotoSettings`):

照片設定屬性

  • `Format`:`Jpeg`, `Png`, `Bmp`。
  • `CroppedAspectRatio`:裁剪比例 (如 16:9, 4:3, 1:1),`0:0` 為自由裁剪。
  • `MaxResolution`:限制最大解析度 (節省儲存/上傳頻寬)。
  • `AllowCropping`:是否啟用裁剪 (預設 `true`)。

影片設定 (`VideoSettings`):

影片設定屬性

  • `Format`:`Mp4`, `Wmv`。
  • `AllowTrimming`:是否啟用剪輯 (預設 `true`)。
  • `MaxDuration`:最長錄製秒數。
  • `MaxResolution`:最高解析度。

4. 完整程式碼範例

擷取照片


using Windows.Media.Capture;
using Windows.Storage;
using Windows.UI.Xaml.Media.Imaging;

// 類別欄位
private StorageFile _photoFile;

private async void OnCapturePhoto(object sender, RoutedEventArgs e) {
    var camera = new CameraCaptureUI();
    // 可選設定
    camera.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg;
    camera.PhotoSettings.CroppedAspectRatio = new Size(16, 9); // 16:9 裁剪
    camera.PhotoSettings.MaxResolution = CameraCaptureUIMaxPhotoResolution.HighestAvailable;

    // 呼叫系統 UI,使用者完成拍照/裁剪/確認後回傳檔案
    _photoFile = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo);

    if (_photoFile != null) {
        // 顯示預覽
        var bitmap = new BitmapImage();
        using (var stream = await _photoFile.OpenReadAsync()) {
            await bitmap.SetSourceAsync(stream);
        }
        PreviewImage.Source = bitmap;

        // 可選:直接喚起分享合約
        DataTransferManager.ShowShareUI();
    }
}

擷取影片


private StorageFile _videoFile;

private async void OnCaptureVideo(object sender, RoutedEventArgs e) {
    var camera = new CameraCaptureUI();
    camera.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4; // 跨平台相容性最佳
    camera.VideoSettings.MaxDuration = TimeSpan.FromMinutes(5);
    camera.VideoSettings.AllowTrimming = true;

    _videoFile = await camera.CaptureFileAsync(CameraCaptureUIMode.Video);

    if (_videoFile != null) {
        // 設定 MediaElement 來源播放
        var stream = await _videoFile.OpenReadAsync();
        MediaPlayer.SetSource(stream, _videoFile.ContentType);
        MediaPlayer.Play();

        DataTransferManager.ShowShareUI();
    }
}

5. 基本原理流程圖

CameraCaptureUI 流程

  1. 宣告 Capabilities (Webcam/Microphone)。
  2. 建立 `CameraCaptureUI` 實例,設定 `PhotoSettings`/`VideoSettings`。
  3. 呼叫 `CaptureFileAsync(Photo|Video|PhotoOrVideo)`。
  4. 系統啟動全螢幕相機 UI (處理預覽、對焦、曝光、拍攝、編輯、確認)。
  5. 使用者點擊確認 → 系統將檔案寫入暫存/本地資料夾 → 回傳 `StorageFile`。
  6. 應用取得 `StorageFile` 進行顯示、上傳、儲存、分享等後續處理。

二、CameraCaptureUI vs MediaCapture:選擇決策矩陣

場景推薦 API理由
使用者大頭貼/個人資料照片CameraCaptureUI內建裁剪完美適配圓形頭像比例 (1:1),無需自行開發裁剪 UI。
文件掃描/條碼掃描/即時 ARMediaCapture需即時畫面分析 (OpenCV/ML.NET)、自訂覆疊 UI、控制對焦/曝光參數、高幀率預覽。
社交短影音錄製 (含濾鏡/貼紙/音樂)MediaCapture + Win2D/Composition API需即時視訊特效、多軌音訊混音、自訂錄製管線。
簡單錄影備忘/證據保存CameraCaptureUI內建剪輯、防震動、格式轉換,零開發成本。
多相機切換 (前/後/外接 USB)MediaCapture`MediaCapture.InitializeAsync` 可指定 `VideoDeviceId` 動態切換。
背景/鎖屏/無 UI 錄製MediaCapture`CameraCaptureUI` 必須前景全螢幕,無法背景運作。
相容性測試/自動化測試MediaCapture可程式化控制每一幀,無系統 UI 干擾。

三、CameraCaptureUI 進階技巧與避坑

  1. 檔案儲存位置:回傳的 `StorageFile` 位於應用暫存資料夾 (`ApplicationData.Current.TemporaryFolder`),**應用關閉可能被清理**。若需永久保存,必須 `CopyAsync` 至 `LocalFolder` 或 `KnownFolders.PicturesLibrary` (需 `Pictures Library` Capability)。
  2. 取消操作**:使用者在相機 UI 點擊「取消」/ 返回鍵 → `CaptureFileAsync` 回傳 `null`,**必須檢查 null**。
  3. 方向感應器**:系統 UI 自動處理裝置旋轉,儲存的影像 EXIF 方向標籤正確,**無需手動旋轉**。
  4. 解析度選擇**:`MaxResolution.HighestAvailable` 可能產生 40MB+ 照片 (4000×3000),上傳/顯示前建議客戶端壓縮或使用 `MaxResolution.VerySmall` (約 1MP) 平衡品質與速度。
  5. 分享整合**:`DataTransferManager.ShowShareUI()` 可在取得檔案後立即喚起分享合約,使用者可直接分享至郵件、社交、OneNote 等。
  6. 錯誤處理**:捕捉 `UnauthorizedAccessException` (使用者拒絕權限)、`FileNotFoundException` (暫存檔遺失)、一般 `Exception` (硬體故障),友善提示使用者。

四、最佳實踐總結

預設選 CameraCaptureUI,除非你需要:即時畫面分析、自訂 UI 覆疊、背景錄製、多相機切換、即時特效/濾鏡、自動化測試。

  • **原型開發 / MVP / 內部工具 / 簡單拍照錄影** → 100% `CameraCaptureUI`,半天完成。
  • **商業級相機應用 / 掃描類 / AR / 直播 / 短視頻編輯器** → 投入 `MediaCapture` 開發 (預估 3-5 倍工時),掌握 `FrameReader`、`MediaSink`、`VideoEffectDefinition` 進階管線。
  • **混合策略**:主流程用 `CameraCaptureUI`,提供「專業模式」按鈕切換至 `MediaCapture` 自訂頁面。

總結

`CameraCaptureUI` 是 Windows 8 給開發者的禮物:**將複雜的相機硬體抽象、系統級 UI/UX 最佳實踐、隱私權限管理、編輯後製流程全部封裝在一個非同步方法中**。善用它,能讓 90% 的拍照/錄影需求在幾小時內交付;識別其邊界,並在必要時果斷遷移至 `MediaCapture`,是 Windows 多媒體開發者的核心判斷力。

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