// TestDevCaptureDlg.cpp : 实现文件 // #include "stdafx.h" #include "TestDevCapture.h" #include "TestDevCaptureDlg.h" #include "afxdialogex.h" #include "xDevCapture.h" #pragma comment(lib,"DevCapture.lib") #ifdef _DEBUG #define new DEBUG_NEW #endif #define TIMER1 1 bool isOpenDevice=false; CTestDevCaptureDlg *mDlg; CString ImgFolderPath; CArray FileArry; int pIndex=0; int pPreviewW=140; const int edgeSapce=2; CArray previewSize; int previewWidth=640; int previewHeight=480; int RotateAngle=0; char* UnicodeToAnsi( const wchar_t* szStr ) { int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL ); if (nLen == 0) { return NULL; } char* pResult = new char[nLen]; WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL ); return pResult; } CString GetExePath(void) { CString m_strPath; int nPos; GetModuleFileName(NULL, m_strPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH); m_strPath.ReleaseBuffer(); nPos = m_strPath.ReverseFind(_T('\\')); m_strPath = m_strPath.Left(nPos); return m_strPath; } // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CTestDevCaptureDlg 对话框 CTestDevCaptureDlg::CTestDevCaptureDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CTestDevCaptureDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTestDevCaptureDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, cb_devname); DDX_Control(pDX, IDC_COMBO2, cb_preRes); DDX_Control(pDX, IDC_LIST1, m_list); DDX_Control(pDX, IDC_COMBO3, cb_format); DDX_Control(pDX, IDC_COMBO4, cb_color); DDX_Control(pDX, IDC_COMBO5, cb_dpi); } BEGIN_MESSAGE_MAP(CTestDevCaptureDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CTestDevCaptureDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CTestDevCaptureDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON3, &CTestDevCaptureDlg::OnBnClickedButton3) ON_CBN_SELCHANGE(IDC_COMBO2, &CTestDevCaptureDlg::OnCbnSelchangeCombo2) ON_WM_DESTROY() ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CTestDevCaptureDlg::OnNMDblclkList1) ON_BN_CLICKED(IDC_BUTTON6, &CTestDevCaptureDlg::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON5, &CTestDevCaptureDlg::OnBnClickedButton5) ON_WM_TIMER() ON_CBN_SELCHANGE(IDC_COMBO1, &CTestDevCaptureDlg::OnCbnSelchangeCombo1) ON_BN_CLICKED(IDC_CHECK2, &CTestDevCaptureDlg::OnBnClickedCheck2) ON_BN_CLICKED(IDC_BUTTON4, &CTestDevCaptureDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON7, &CTestDevCaptureDlg::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON8, &CTestDevCaptureDlg::OnBnClickedButton8) ON_BN_CLICKED(IDC_BUTTON9, &CTestDevCaptureDlg::OnBnClickedButton9) ON_BN_CLICKED(IDC_BUTTON10, &CTestDevCaptureDlg::OnBnClickedButton10) ON_BN_CLICKED(IDC_BUTTON11, &CTestDevCaptureDlg::OnBnClickedButton11) ON_BN_CLICKED(IDC_BUTTON12, &CTestDevCaptureDlg::OnBnClickedButton12) ON_BN_CLICKED(IDC_CHECK3, &CTestDevCaptureDlg::OnBnClickedCheck3) ON_CBN_SELCHANGE(IDC_COMBO3, &CTestDevCaptureDlg::OnCbnSelchangeCombo3) ON_CBN_SELCHANGE(IDC_COMBO4, &CTestDevCaptureDlg::OnCbnSelchangeCombo4) ON_CBN_SELCHANGE(IDC_COMBO5, &CTestDevCaptureDlg::OnCbnSelchangeCombo5) ON_BN_CLICKED(IDC_BUTTON13, &CTestDevCaptureDlg::OnBnClickedButton13) ON_BN_CLICKED(IDC_BUTTON14, &CTestDevCaptureDlg::OnBnClickedButton14) ON_BN_CLICKED(IDC_BUTTON15, &CTestDevCaptureDlg::OnBnClickedButton15) ON_BN_CLICKED(IDC_BUTTON16, &CTestDevCaptureDlg::OnBnClickedButton16) ON_BN_CLICKED(IDC_BUTTON17, &CTestDevCaptureDlg::OnBnClickedButton17) ON_BN_CLICKED(IDC_BUTTON18, &CTestDevCaptureDlg::OnBnClickedButton18) ON_BN_CLICKED(IDC_RADIO1, &CTestDevCaptureDlg::OnBnClickedRadio1) ON_BN_CLICKED(IDC_RADIO2, &CTestDevCaptureDlg::OnBnClickedRadio2) ON_BN_CLICKED(IDC_RADIO3, &CTestDevCaptureDlg::OnBnClickedRadio3) END_MESSAGE_MAP() // CTestDevCaptureDlg 消息处理程序 /* 获取设备相关信息 */ int CTestDevCaptureDlg::toGetCamInfo() { int iRest=-1; int DevCount=GetDeviceCount(); if(DevCount<=0) { AfxMessageBox(_T("未发现合适的设备!")); return -1; } for(int i=0;i0) cb_devname.SetCurSel(0); return 0; } /* 获取设备分辨率 */ int CTestDevCaptureDlg::toGetCamResolution() { int iRest=-1; int resCount=GetStillResolutionCount(cb_devname.GetCurSel()); //获取预览分辨率数目 if(resCount<=0) return -1; int width=0; int height=0; CString resStr; CArray ListWidth; CArray ListHeght; for(int i=0;icmpVal) { cmpVal=ListWidth.GetAt(i); pos=i; } } if(cb_preRes.GetCount()>0) cb_preRes.SetCurSel(pos); return 0; } /* 打开摄像头 */ int CTestDevCaptureDlg::toOpenDevice() { if(isOpenDevice) CloseDevice(); if(cb_devname.GetCount()>0 && cb_preRes.GetCount()>0) { int iRest=-1; int CamIndx=cb_devname.GetCurSel(); CString resStr; cb_preRes.GetLBText(cb_preRes.GetCurSel(),resStr); int pos=resStr.Find('*'); int previewWidth=_ttoi(resStr.Left(pos)); int previewHeight=_ttoi(resStr.Right(resStr.GetLength()-pos-1)); CWnd *pWnd=GetDlgItem(IDC_PICA); HWND hwnd = pWnd->GetSafeHwnd(); iRest=OpenDeviceEx(CamIndx,previewWidth,previewHeight,hwnd,true); if(iRest!=0) { isOpenDevice=false; AfxMessageBox(_T("开启设备失败!")); return -1; } else { isOpenDevice=true; } } return 0; } void CTestDevCaptureDlg::OnDestroy() { CDialogEx::OnDestroy(); CloseDevice(); GdiplusShutdown(m_GdiplusToken); //关闭GDI+ } BOOL CTestDevCaptureDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 GdiplusStartup(&m_GdiplusToken, &gdiStartInput, NULL); //开启GDI+ ImgFolderPath=GetExePath() + _T("\\Image"); if(!PathIsDirectory(ImgFolderPath)) ::CreateDirectory(ImgFolderPath,false); FileArry.RemoveAll(); //清空全部 DWORD dwStyle; dwStyle = m_list.GetExtendedStyle(); dwStyle = dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES|LVS_EX_CHECKBOXES|LVS_ALIGNTOP ; m_list.SetExtendedStyle(dwStyle); CRect mRect; GetDlgItem(IDC_LIST1)->GetWindowRect(&mRect); int length = mRect.right-mRect.left; if(length(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CTestDevCaptureDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } //切换摄像头 void CTestDevCaptureDlg::OnCbnSelchangeCombo1() { int iRest=-1; cb_preRes.ResetContent(); if(isOpenDevice) CloseDevice(); iRest=toGetCamResolution(); if(iRest!=0) { AfxMessageBox(_T("切换摄像头失败!")); } else { toOpenDevice(); } } //打开设备 void CTestDevCaptureDlg::OnBnClickedButton1() { if(cb_devname.GetCount()>0) toOpenDevice(); } //关闭设备 void CTestDevCaptureDlg::OnBnClickedButton2() { isOpenDevice=false; CloseDevice(); CRect rect; GetDlgItem(IDC_PICA)->GetWindowRect(&rect); ScreenToClient(&rect); InvalidateRect(rect);//刷新控件 } //拍照 void CTestDevCaptureDlg::OnBnClickedButton3() { SYSTEMTIME st; CString strDate,strTime; GetLocalTime(&st); strDate.Format(_T("%4d%d%d"),st.wYear,st.wMonth,st.wDay); strTime.Format(_T("%d%d%d%3d"),st.wHour,st.wMinute,st.wSecond,st.wMilliseconds) ; CString suffixStr=_T(".jpg"); if(cb_format.GetCurSel()==0) suffixStr=_T(".jpg"); if(cb_format.GetCurSel()==1) suffixStr=_T(".bmp"); if(cb_format.GetCurSel()==2) suffixStr=_T(".png"); if(cb_format.GetCurSel()==3) suffixStr=_T(".tif"); if(cb_format.GetCurSel()==4) suffixStr=_T(".pdf"); CString path=ImgFolderPath + _T("\\") + strDate + strTime + suffixStr ; CaptureFromStill(UnicodeToAnsi(path.GetBuffer(0))); AddToPreview(path); } //切换分辨率 void CTestDevCaptureDlg::OnCbnSelchangeCombo2() { if(isOpenDevice) { isOpenDevice=false; CloseDevice(); } toOpenDevice(); } //设置图片格式 void CTestDevCaptureDlg::OnCbnSelchangeCombo3() { SetFormatType(cb_format.GetCurSel()); } //设置色彩模式 void CTestDevCaptureDlg::OnCbnSelchangeCombo4() { SetColorType(cb_color.GetCurSel()); } //设置DPI void CTestDevCaptureDlg::OnCbnSelchangeCombo5() { CString resStr; cb_dpi.GetLBText(cb_dpi.GetCurSel(),resStr); SetDpi(1,_ttoi(resStr)); } //裁切模式 void CTestDevCaptureDlg::OnBnClickedRadio1() { if( ((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck() ) { SetCutType(0); } } void CTestDevCaptureDlg::OnBnClickedRadio2() { if( ((CButton *)GetDlgItem(IDC_RADIO2))->GetCheck() ) { SetCutType(1); } } void CTestDevCaptureDlg::OnBnClickedRadio3() { if( ((CButton *)GetDlgItem(IDC_RADIO3))->GetCheck() ) { SetCutType(2); } } //去底色 void CTestDevCaptureDlg::OnBnClickedCheck2() { if( ((CButton *)GetDlgItem(IDC_CHECK2))->GetCheck() ) { SetDelBgColor(1); } else { SetDelBgColor(0); } } //去黑边 void CTestDevCaptureDlg::OnBnClickedCheck3() { if( ((CButton *)GetDlgItem(IDC_CHECK3))->GetCheck() ) { SetDelBlackEdge(1); } else { SetDelBlackEdge(0); } } //左旋 void CTestDevCaptureDlg::OnBnClickedButton4() { RotateAngle--; if (RotateAngle < 0) RotateAngle = 3; SetRotateAngle(RotateAngle); } //右旋 void CTestDevCaptureDlg::OnBnClickedButton7() { RotateAngle++; if (RotateAngle > 3) RotateAngle = 0; SetRotateAngle(RotateAngle); } //放大 void CTestDevCaptureDlg::OnBnClickedButton8() { ZoomIn(); } //缩小 void CTestDevCaptureDlg::OnBnClickedButton9() { ZoomOut(); } //适合大小 void CTestDevCaptureDlg::OnBnClickedButton10() { BestSize(); } //1:1 void CTestDevCaptureDlg::OnBnClickedButton11() { TrueSize(); } //对焦 void CTestDevCaptureDlg::OnBnClickedButton12() { ManualFocus(); } //硬件参数设置 void CTestDevCaptureDlg::OnBnClickedButton13() { ShowCameraSettingWindow(); } //条码识别 void CTestDevCaptureDlg::OnBnClickedButton14() { char code[512]; memset(code,'\0',512); RecogQrBarCode(0,code); CString content(code); if(content!=_T("")) { AfxMessageBox(content); } else { AfxMessageBox(L"未识别到条码"); } } //二维码识别 void CTestDevCaptureDlg::OnBnClickedButton15() { char code[512]; memset(code,'\0',512); RecogQrBarCode(1,code); CString content(code); if(content!=_T("")) { AfxMessageBox(content); } else { AfxMessageBox(L"未识别到二维码"); } } //图片合并测试 void CTestDevCaptureDlg::OnBnClickedButton16() { CString path1=GetExePath() + _T("\\test1.jpg"); CString path2=GetExePath() + _T("\\test2.jpg"); AddImagePath(UnicodeToAnsi(path1.GetBuffer(0))); path1.ReleaseBuffer(); AddImagePath(UnicodeToAnsi(path2.GetBuffer(0))); path2.ReleaseBuffer(); CString joinPath=GetExePath() + _T("\\joinimg.jpg"); MergeImages(UnicodeToAnsi(joinPath.GetBuffer(0)),0,5); joinPath.ReleaseBuffer(); AddToPreview(joinPath); } //PDF合并测试 void CTestDevCaptureDlg::OnBnClickedButton17() { CString path1=GetExePath() + _T("\\test1.jpg"); CString path2=GetExePath() + _T("\\test2.jpg"); AddImageFileToPDF(UnicodeToAnsi(path1.GetBuffer(0))); path1.ReleaseBuffer(); AddImageFileToPDF(UnicodeToAnsi(path2.GetBuffer(0))); path2.ReleaseBuffer(); CString joinPath=GetExePath() + _T("\\joinpdf.pdf"); CombineToPDF(UnicodeToAnsi(joinPath.GetBuffer(0))); joinPath.ReleaseBuffer(); AddToPreview(joinPath); } /***********************************列表操作******************************************/ // 从内存加载图片,失败返回NULL Bitmap* LoadBitmapFromMemory(const void* memory, DWORD size) { Bitmap* bmp = NULL; IStream* stream = NULL; if (CreateStreamOnHGlobal(NULL, TRUE, &stream) == S_OK) { ULARGE_INTEGER uli; uli.QuadPart = size; stream->SetSize(uli); if (stream->Write(memory, size, NULL) == S_OK) bmp = ::new Bitmap(stream,FALSE); stream->Release(); } return bmp; } // 从文件加载图片,不独占文件,失败返回NULL Bitmap* LoadBitmapFromFile(const TCHAR* file_name) { Bitmap* bmp = NULL; HANDLE file_handle = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle != INVALID_HANDLE_VALUE) { DWORD temp = 0; DWORD file_size = GetFileSize(file_handle, &temp); if (file_size && !temp) // 不处理大于4G的文件 { // 将图片文件读到内存后,再从内存创建Bitmap unsigned char* buffer = new unsigned char[file_size]; if (ReadFile(file_handle, buffer, file_size, &temp, NULL)) bmp = LoadBitmapFromMemory(buffer, temp); delete [] buffer; } CloseHandle(file_handle); } return bmp; } Bitmap* CTestDevCaptureDlg::toGetThumbnailBitmap(CString path) { CString prewPath=path; CString ImageFormat=prewPath.Right(3); if(ImageFormat=="pdf" || ImageFormat=="PDF") { //isPdf=true; prewPath = GetExePath() + _T("\\PdfLogo.bmp"); } Bitmap *bmp; bmp=LoadBitmapFromFile(prewPath.GetBuffer(0)); if(bmp->GetWidth()>=bmp->GetHeight()) { int tbWidth = pPreviewW; //获得图片宽度,这个120和创建的120保持相同。 int tbHeight = pPreviewW* bmp->GetHeight()/bmp->GetWidth(); //获得图片宽度 bmp = (Bitmap*)bmp->GetThumbnailImage(tbWidth , tbHeight , NULL, NULL); //设定缩略图的大小 } else { int tbHeight = pPreviewW; //获得图片宽度,这个120和创建的120保持相同。 int tbWidth = pPreviewW* bmp->GetWidth()/bmp->GetHeight(); //获得图片宽度 bmp = (Bitmap*)bmp->GetThumbnailImage(tbWidth , tbHeight , NULL, NULL); //设定缩略图的大小 } Bitmap *AllBmp; AllBmp=::new Bitmap(pPreviewW,pPreviewW,PixelFormat24bppRGB); Pen mpen(Color::DarkGray,2); int startx=(pPreviewW-bmp->GetWidth())/2; int starty=(pPreviewW-bmp->GetHeight())/2; Graphics *myGraphics=NULL; myGraphics = Graphics::FromImage(AllBmp); myGraphics->Clear((ARGB)Color::White); myGraphics->DrawRectangle(&mpen,0,0,pPreviewW,pPreviewW); myGraphics->DrawImage(bmp,startx+2,starty+2,bmp->GetWidth()-4,bmp->GetHeight()-4); myGraphics->~Graphics(); myGraphics=NULL; delete bmp; bmp=NULL; return AllBmp; } void CTestDevCaptureDlg::AddToPreview(CString fPath) { FileArry.Add(fPath); pIndex=FileArry.GetSize()-1; HBITMAP hBitmap; CBitmap *pBitmap; pBitmap = new CBitmap; Bitmap *LastBmp=toGetThumbnailBitmap(fPath); LastBmp->GetHBITMAP(NULL, &hBitmap); pBitmap->Attach(hBitmap); m_imList.Add(pBitmap,RGB(255,255,255)); LastBmp->~Bitmap(); LastBmp=NULL; delete pBitmap; pBitmap=NULL; int nRow; LVITEM lvItem={0}; lvItem.mask = LVIF_IMAGE|LVIF_TEXT|LVIF_STATE; //文字、图片、状态 lvItem.iItem = pIndex; //行号 lvItem.iImage = pIndex; //图片索引号 lvItem.iSubItem = 0; //子列号 nRow = m_list.InsertItem(&lvItem); //第一列为图片 m_list.EnsureVisible(pIndex,FALSE); } void CTestDevCaptureDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); NM_LISTVIEW *pNMListView=(NM_LISTVIEW *)pNMHDR; int nItem=pNMListView->iItem; if(nItem>=0 && nItem deleteIndex; for(int i=0;i-1;i--) { m_list.DeleteItem(deleteIndex.GetAt(i)); m_imList.Remove(deleteIndex.GetAt(i)); CString fPath=FileArry.GetAt(deleteIndex.GetAt(i)); if(PathFileExists(fPath)) { DeleteFile(fPath); } FileArry.RemoveAt(deleteIndex.GetAt(i)); } } void CTestDevCaptureDlg::OnTimer(UINT_PTR nIDEvent) { switch(nIDEvent) { case TIMER1: break; default: break; } CDialogEx::OnTimer(nIDEvent); } //读取身份证 void CTestDevCaptureDlg::OnBnClickedButton18() { int iRest = ReadCard(); if (iRest != 0) { AfxMessageBox(L"读卡失败!"); } else { CString name = (CString)GeCardInfo(0); CString sex = (CString)GeCardInfo(1); CString nation = (CString)GeCardInfo(2); CString born = (CString)GeCardInfo(3); CString address = (CString)GeCardInfo(4); CString num = (CString)GeCardInfo(5); CString IssuedAt = (CString)GeCardInfo(6); CString EffectedDate = (CString)GeCardInfo(7); CString ExpiredDate = (CString)GeCardInfo(8); CString headImgPath = (CString)GeCardInfo(9); CString info = L"姓名:" + name + L"\r\n" + L"性别:" + sex + L"\r\n" + L"民族:" + nation + L"\r\n" + L"出生:" + born + L"\r\n" + L"住址:" + address + L"\r\n" + L"公民身份号码:" + num + L"\r\n" + L"签证机关:" + IssuedAt + L"\r\n" + L"有效日期:" + EffectedDate + L"-" + ExpiredDate + L"\r\n" + L"证件头像图片路径:" + headImgPath; AfxMessageBox(info); } }