在Windows下进行摄像头拍照功能开发,可以借助开源的摄像头项目或者一系列的demo。
本程序实现一个简单的拍照功能, 需要使用Cximage库, CCameraAPI库,这些都是开源的,我们可以直接使用它提供出来的接口就可以了。
一、初始化摄像头过程
之前得再CTakephotoDlg类中创建一个私有的CCameraAPI 指针,并在CTakephotoDlg构造函数中置为空。
class CTakephotoDlg : public CDialog { // Construction public: CTakephotoDlg(CWnd* pParent = NULL); // standard constructor ~CTakephotoDlg(); // standard constructor // Dialog Data //{{AFX_DATA(CTakephotoDlg) enum { IDD = IDD_TAKEPHOTO_DIALOG }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTakephotoDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation private: CCameraAPI * m_pCamera; //创建一个CCameraAPI指针 public: void InitCamera(); protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CTakephotoDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnBtnPhoto(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
在构造函数中将该指针置为NULL;
//初始化时清空 m_pCamera = NULL;
1 //初始化摄像头设备 2 void CTakephotoDlg::InitCamera() 3 { 4 if(NULL == m_pCamera) 5 { 6 //创建一个摄像头api对象,之后通过调用这个对象提供的方法来拍照 7 m_pCamera = new CCameraAPI(); 8 9 if(NULL == m_pCamera) 10 { 11 return ; 12 } 13 14 //获取窗口句柄 15 CWnd* pCwnd = this->GetDlgItem(IDC_EDIT_VIDEO); 16 17 if(NULL == pCwnd) 18 { 19 return; 20 } 21 22 //摄像头ID,可以任意填写 23 CString strPid ="0"; 24 25 //摄像头和某个窗口相关联,即预览显示的窗口 26 m_pCamera->Init(pCwnd->m_hWnd, strPid); 27 } 28 }
二、拍照过程
1 //拍照响应函数 2 void CTakephotoDlg::OnBtnPhoto() 3 { 4 // TODO: Add your control notification handler code here 5 6 //每次点击拍照按钮,拍照保存的图片为次数索引值 7 static int nImageIndex = 0; 8 9 CString strImageIndex = ""; 10 11 strImageIndex.Format("%d",nImageIndex); 12 13 //图像保存的位置 14 CString strSaveDir = "D:\" + strImageIndex + ".jpg"; 15 16 //获取视频预览当前中的一张图像帧 17 CxImage* pCximage = m_pCamera->GetImage(); 18 19 //保存该图像帧 20 pCximage->Save(strSaveDir, 3); 21 22 //下次拍照保存后的图片名 23 nImageIndex++; 24 }
三、程序运行结果