摄像头(02_MzICamera)

摄像头

此示例代码展示如何使用摄像头相关组件。

 两种启动摄像头的方式:
    1、Camera App:
    

    IMzOpen *pOpen = NULL;
    ICameraApp *pCameraApp = NULL;
    HRESULT hRes = S_OK;
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    hRes = CoCreateInstance( CLSID_Camera, NULL,CLSCTX_INPROC_SERVER ,IID_MZ_Open ,(void **)&pOpen );

    if( SUCCEEDED(hRes) )
    {
    if( SUCCEEDED( pOpen->QueryInterface( IID_MZ_CameraApp, (void**)&pCameraApp ) ) )
    {
    pCameraApp->SetMainWindowHandle(m_hWnd);

    int value = pOpen->Invoke();
    RETAILMSG(1, (TEXT("\n  value is %d...... \n"),value));

    if(pCameraApp)
    {
    pCameraApp->Release();
    pCameraApp = NULL;
    }
    }        

    if(pOpen)
    {
    pOpen->Release();
    pOpen = NULL;
    }
    }      
    CoUninitialize();  
    2、Camera Device com interface:
    

    if(m_pCameraDevice->InitDevice(m_hWnd))
    {
        m_pCameraDevice->IsDrawPreviewFrame(true);  
    }  

    if(m_pCameraDevice)
    {
         m_pCameraDevice->UnInitDevice();
    }
    m_pCameraDevice->Release();
    m_pCameraDevice = NULL;

完整示例

/************************************************************************/
/*
* Copyright (C) Meizu Technology Corporation Zhuhai China
* All rights reserved.
* 中国珠海, 魅族科技有限公司, 版权所有.
*
* Author:    
* Create on: 2009-07-08
*/
/************************************************************************/

//请按照以步骤运行此实例代码:
//首先, 打开VS2005/2008创建一个Win 32智能设备项目
//在项目向导中选择M8SDK, 并勾选空项目
//然后,在项目中新建一个cpp文件,将此处代码拷贝到cpp文件中
//最后,按照M8SDK的帮助文档,配置项目属性
//现在,可以运行此程序了

//包含MZFC库的头文件
#include <mzfc_inc.h>
#include <initguid.h>
#include <IMzUnknown.h>
#include <IMzUnknown_IID.h>
#include <ICamera_GUID.h>
#include <ICameraApp.h>
#include <ICameraDeviceInterface.h>

//此代码演示了:
//如何启动摄像头,生成预览画面

#define  TEST_TIMER_ID        666
#define  TEST_TIMER_RATE1     5000
#define  TEST_TIMER_RATE2     10

// 按钮控件的ID
#define MZ_IDC_TESTBTN1  101

// 从 CMzWndEx 派生的主窗口类
class CSample1MainWnd: public CMzWndEx
{
  MZ_DECLARE_DYNAMIC(CSample1MainWnd);
public:
  // 窗口中的按钮控件
  UiButton m_btn;
  ICameraDeviceInterface *m_pCameraDevice;
protected:
  // 窗口的初始化
  virtual BOOL OnInitDialog()
  {
    // 必须先调用基类的初始化
    if (!CMzWndEx::OnInitDialog())
    {
      return FALSE;
    }
   
    // Camera App
    IMzOpen *pOpen = NULL;
    ICameraApp *pCameraApp = NULL;
    HRESULT hRes = S_OK;
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    hRes = CoCreateInstance( CLSID_Camera, NULL,CLSCTX_INPROC_SERVER ,IID_MZ_Open ,(void **)&pOpen );

    if( SUCCEEDED(hRes) )
    {
        if( SUCCEEDED( pOpen->QueryInterface( IID_MZ_CameraApp, (void**)&pCameraApp ) ) )
        {
            pCameraApp->SetMainWindowHandle(m_hWnd);

            int value = pOpen->Invoke();
            RETAILMSG(1, (TEXT("\n  value is %d...... \n"),value));

            if(pCameraApp)
            {
                pCameraApp->Release();
                pCameraApp = NULL;
            }
        }        

        if(pOpen)
        {
            pOpen->Release();
            pOpen = NULL;
        }
    }      
    CoUninitialize();  

    //Camera Device com interface
//      HRESULT hRes = S_OK;
//      CoInitializeEx(NULL, COINIT_MULTITHREADED);
//      hRes = CoCreateInstance( CLSID_CameraDevice, NULL,CLSCTX_INPROC_SERVER ,IID_MZ_CameraInterface ,(void **)&m_pCameraDevice );
//  
//      if( SUCCEEDED(hRes) )
//      {
//        if(m_pCameraDevice->InitDevice(m_hWnd))
//        {
//          m_pCameraDevice->IsDrawPreviewFrame(true);  
//        }  
//      }      
//      CoUninitialize();

    SetTimer(m_hWnd, TEST_TIMER_ID, TEST_TIMER_RATE1, NULL);
    return TRUE;
  }

  // 重载命令消息的处理函数
  virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
  {
    UINT_PTR id = LOWORD(wParam);
    switch(id)
    {
    case MZ_IDC_TESTBTN1:
      {
        DEVMODE  DevMode;
        memset(&DevMode, 0, sizeof(DevMode));
        DevMode.dmSize = sizeof(DevMode);
        DevMode.dmFields = DM_DISPLAYORIENTATION;
        DevMode.dmDisplayOrientation = 1;
        if(DISP_CHANGE_FAILED == ChangeDisplaySettingsEx(NULL, &DevMode, NULL, 0, NULL))
        {
          int err = GetLastError();
          RETAILMSG(1, (_T("::::::::::::::: Unable to read current rotation. Rotation disabled (%d)::::::::::::::::\n"),err));        
        }

        HWND hShellWnd = ::FindWindow(L"CTaskBar", NULL);
        if(hShellWnd)
        {
          ::ShowWindow(hShellWnd, SW_SHOW);
        }

        //Camera device com interface 
        if(m_pCameraDevice)
        {
          m_pCameraDevice->UnInitDevice();
        }
        m_pCameraDevice->Release();
        m_pCameraDevice = NULL;

        CoUninitialize();

        if(1 == MzMessageBoxEx(m_hWnd, L"You have pressed Exit button, Really want exit?", L"Exit", MB_YESNO, false))
          PostQuitMessage(0);
      }
      break;
    }
  }

  LRESULT MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
  {
    switch (message)
    {
    case WM_TIMER:
      {
        switch(wParam)
        {
        case TEST_TIMER_ID:
          {
            m_pCameraDevice->IsDrawPreviewFrame(false);
            KillTimer(m_hWnd, TEST_TIMER_ID);
            HDC previewFrameDC = CreateCompatibleDC(GetDC(m_hWnd));
            HBITMAP hPreviewFrameBitmap = CreateCompatibleBitmap(GetDC(m_hWnd), 480, 720);
            HGDIOBJ hOldPreviewBmp = SelectObject(previewFrameDC, hPreviewFrameBitmap);

            HDC standByDC = CreateCompatibleDC(GetDC(m_hWnd));
            HBITMAP hStandByBitmap = CreateCompatibleBitmap(GetDC(m_hWnd), 480, 720);
            HGDIOBJ hStandByOldBmp = SelectObject(standByDC, hStandByBitmap);          

            if(FALSE == StretchDIBits(standByDC, 0, 0, 480, 720, 0, 0,
              480, 720, m_pCameraDevice->GetPreviewData()->Data, m_pCameraDevice->GetPreviewDataInfo(), 
              DIB_RGB_COLORS, SRCCOPY))
            {
              RETAILMSG(1, (TEXT("Stretch DIBits failed...\r\n")));      
            }

            for ( int i = 1; i <= 720; ++i)
            {
              BitBlt(previewFrameDC, 0, i, 480, 1, standByDC, 0, 720-i, SRCCOPY );
            }

            BitBlt(GetDC(m_hWnd), 0, 0, 480, 720, previewFrameDC, 0, 0, SRCCOPY );

            SelectObject(standByDC, hStandByOldBmp);
            DeleteObject(hStandByBitmap);
            DeleteDC(standByDC);

            SelectObject(previewFrameDC, hOldPreviewBmp);
            DeleteObject(hPreviewFrameBitmap);
            DeleteDC(previewFrameDC);
            SetTimer(m_hWnd, TEST_TIMER_ID, TEST_TIMER_RATE2, NULL);
          }
        }
      }
    }
    return CMzWndEx::MzDefWndProc(message, wParam, lParam);
  }
};

MZ_IMPLEMENT_DYNAMIC(CSample1MainWnd)

// 从 CMzApp 派生的应用程序类
class CSample1App: public CMzApp
{
public:
  // 应用程序的主窗口
  CSample1MainWnd m_MainWnd;

  // 应用程序的初始化
  virtual BOOL Init()
  {
    CoInitializeEx(NULL,  COINIT_MULTITHREADED); 

    HWND hShellWnd = ::FindWindow(L"CTaskBar", NULL);
    if(hShellWnd)
    {
      ::ShowWindow(hShellWnd, SW_HIDE);
    }

    if(m_MainWnd.Create(0, 0, 480, 720, 0, 0, 0, 0))
    {
      m_MainWnd.SetBgColor(RGB(16,0,16));
      m_MainWnd.Show();
      return TRUE;
    }  
    return TRUE;
  }
};

// 全局的应用程序对象
CSample1App theApp;


Generated at Tue Feb 9 15:09:55 2010 for Meizu M8 SDK Documentation by  doxygen 1.6.1