1. 程式人生 > >在mobile上呼叫SHCameraCapture介面進行拍照

在mobile上呼叫SHCameraCapture介面進行拍照

 本文所要講的是使用SHCameraCapture介面可以調出照相機進行拍照、攝像,並得到圖片或視訊檔案的路徑。

以下程式碼進行拍照:

  1. SHCAMERACAPTURE shcc;
  2. ZeroMemory(&shcc, sizeof(shcc));
  3. shcc.cbSize             = sizeof(shcc);
  4. shcc.hwndOwner          = NULL;
  5. shcc.pszInitialDir      = NULL;
  6. shcc.pszDefaultFileName = NULL;
  7. shcc.pszTitle           = NULL;
  8. shcc.StillQuality       = CAMERACAPTURE_STILLQUALITY_DEFAULT;
  9. shcc.VideoTypes         = CAMERACAPTURE_VIDEOTYPE_ALL;
  10. shcc.nResolutionWidth   = 0;
  11. shcc.nResolutionHeight  = 0;
  12. shcc.nVideoTimeLimit    = 0;
  13. shcc.Mode               = CAMERACAPTURE_MODE_STILL;
  14. HRESULT hReturn = SHCameraCapture(&shcc);

如果hReturn為S_OK,則表示拍照成功,shcc.szFile即為檔名稱(包含路徑)。shcc.pszInitialDir和shcc.pszDefaultFileName可以設定儲存路徑和預設檔名。shcc.hwndOwner如果使用了不同的窗體,可能會有問題。

如果要進行攝像,有些引數需進行調整,如下
shcc.StillQuality       = CAMERACAPTURE_STILLQUALITY_NORMAL;
shcc.VideoTypes         = CAMERACAPTURE_VIDEOTYPE_STANDARD;
shcc.nResolutionWidth   = 640;
shcc.nResolutionHeight  = 480;
shcc.Mode               = CAMERACAPTURE_MODE_VIDEOWITHAUDIO;

這些引數涉及到幾個列舉變數,我們來看看:
typedef enum {
    CAMERACAPTURE_MODE_STILL = 0,
    CAMERACAPTURE_MODE_VIDEOONLY,
    CAMERACAPTURE_MODE_VIDEOWITHAUDIO,
} CAMERACAPTURE_MODE;

CAMERACAPTURE_MODE_STILL對應照片,CAMERACAPTURE_MODE_VIDEOONLY對應無聲視訊,CAMERACAPTURE_MODE_VIDEOWITHAUDIO對應有聲視訊。

typedef enum {
    CAMERACAPTURE_STILLQUALITY_DEFAULT = 0,
    CAMERACAPTURE_STILLQUALITY_LOW,
    CAMERACAPTURE_STILLQUALITY_NORMAL,
    CAMERACAPTURE_STILLQUALITY_HIGH,
} CAMERACAPTURE_STILLQUALITY;

對應圖片和視訊清晰度。

typedef enum {
    CAMERACAPTURE_VIDEOTYPE_ALL = 0xFFFF,
    CAMERACAPTURE_VIDEOTYPE_STANDARD = 1,
    CAMERACAPTURE_VIDEOTYPE_MESSAGING = 2,
} CAMERACAPTURE_VIDEOTYPES;

CAMERACAPTURE_VIDEOTYPE_ALL對應照片,CAMERACAPTURE_VIDEOTYPE_STANDARD對應WMV視訊,CAMERACAPTURE_VIDEOTYPE_MESSAGING對應MMS視訊。當使用後兩個值時,shcc的nResolutionWidth和nResolutionHeight成員均不能為零。一般是640x480。

很遺憾,這個介面只能在WM5.0以上使用。WM2003上沒有統一攝像頭標準,硬體廠商各做各的,只能跟硬體廠商詢問呼叫方法。

下面給出兩個函式程式碼:

  1. 1.拍照
  2. LPCTSTR CphotoDlg::StartTakePic(void)
  3. {
  4. HRESULT hReturn;   
  5.     SHCAMERACAPTURE shcc;   
  6.     CString str = GetCurWorkingDir();
  7. //   Specify   the   arguments   of   SHCAMERACAPTURE   
  8.     ZeroMemory( &shcc, sizeof( shcc ) );   
  9.     shcc.cbSize = sizeof( shcc );   
  10. //shcc.hwndOwner = m_hWnd;  
  11.     shcc.hwndOwner = NULL;
  12.     shcc.pszDefaultFileName = L"photo.jpg";
  13.     shcc.pszTitle = NULL;
  14.     shcc.pszInitialDir = str;
  15.     shcc.StillQuality = CAMERACAPTURE_STILLQUALITY_DEFAULT;   
  16.     shcc.VideoTypes = CAMERACAPTURE_VIDEOTYPE_ALL;   
  17.     shcc.nResolutionWidth   = 0;
  18.     shcc.nResolutionHeight  = 0;
  19.     shcc.nVideoTimeLimit    = 0;
  20.     shcc.Mode = CAMERACAPTURE_MODE_STILL;     
  21. //Call   SHCameraCapture()   function   
  22.     hReturn = SHCameraCapture( &shcc );   
  23. //Check   the   return   codes   of   the   SHCameraCapture()   function   
  24. switch (hReturn)   
  25.     {   
  26. case S_OK:   
  27.         AfxMessageBox( L"成功拍照" );
  28. return  (LPCTSTR)shcc.szFile;   
  29. case S_FALSE:   
  30. //The   user   canceled   the   Camera   Capture   dialog   box.   
  31.         AfxMessageBox( L"沒有拍照" );
  32. break;   
  33. case E_INVALIDARG:   
  34. break;   
  35. case E_OUTOFMEMORY:   
  36.         {
  37.             AfxMessageBox( L"Out of Memory" );
  38.         }   
  39. break;   
  40. default:   
  41. break;   
  42.     }   
  43. return   NULL;
  44. }
  45. 2.攝像(預設儲存的是mp4格式)
  46. LPCTSTR CphotoDlg::StartRecord(void)
  47. {
  48. HRESULT hReturn;   
  49.     SHCAMERACAPTURE shcc;   
  50.     CString str = GetCurWorkingDir();
  51. //Specify   the   arguments   of   SHCAMERACAPTURE   
  52.     ZeroMemory( &shcc, sizeof( shcc ) );   
  53.     shcc.cbSize = sizeof( shcc );   
  54.     shcc.hwndOwner = m_hWnd;  
  55.     shcc.pszInitialDir = str;
  56.     shcc.pszDefaultFileName = TEXT( "video.3gp" );
  57.     shcc.pszTitle = NULL;
  58.     shcc.StillQuality = CAMERACAPTURE_STILLQUALITY_HIGH;   
  59.     shcc.VideoTypes = CAMERACAPTURE_VIDEOTYPE_STANDARD;   
  60.     shcc.nResolutionWidth   = 640;     //這兩個引數如果設定非零,模擬器是調不出來的,但是真機上是沒得問題的。
  61.     shcc.nResolutionHeight  = 480;
  62.     shcc.nVideoTimeLimit = 0;    //0表示無限制錄影時間
  63.     shcc.Mode = CAMERACAPTURE_MODE_VIDEOWITHAUDIO;     
  64. //Call   SHCameraCapture()   function   
  65.     hReturn = SHCameraCapture( &shcc );   
  66. //Check   the   return   codes   of   the   SHCameraCapture()   function   
  67. switch (hReturn)   
  68.     {   
  69. case S_OK: 
  70.         AfxMessageBox( L"成功錄影" );
  71. return  (LPCTSTR)shcc.szFile;   
  72. case S_FALSE:   
  73. //The   user   canceled   the   Camera   Capture   dialog   box.  
  74.         AfxMessageBox( L"沒有錄影" );
  75. break;   
  76. case E_INVALIDARG: 
  77.         AfxMessageBox( L"E_INVALIDARG" );
  78. break;   
  79. case E_OUTOFMEMORY:   
  80.         AfxMessageBox( L"Out of Memory" ); 
  81. break;   
  82. default:   
  83. break;   
  84.     }   
  85. return   NULL;
  86. }