摄像头
此示例代码展示如何使用摄像头相关组件。
两种启动摄像头的方式: 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;