• VS2010开发MFC ActiveX,摄像头拍照上传Webservice(2)


    继续记录,第二步开发摄像头拍照功能.

    使用vfw.h开发摄像头拍照功能,关于vfw网上有很多文章,很多代码可以参考

    参考:http://blog.163.com/huangqiao_8/blog/static/33900492008017111847364/

    Vedio for Windows 是WIN32 SDK 中多媒体编程SDK 的视频开发工具。在微软的Visual C ++中提供了Vedio for Windows 的头文件vfw.h 和库文件vfw32.lib。

    在ActiveX中显示的Dialog中增加一个picture控件,设置ID为IDC_VIDEO,加入按钮,打开摄像头,拍照等,下面会贴入关键代码:

    1.引入vfw.h

    #include <vfw.h>
    #pragma comment(lib,"vfw32.lib")
    //如果没有引入afxcmn.h,在stdafx.h中添加:
    //#include <afxcmn.h> 

    2.在对话框的头文件中加入如下变量

    public:
        friend    UINT vproc(LPVOID pParam);
        friend LRESULT CALLBACK backproc(HWND hwnd,LPVIDEOHDR lpVHDR);
    private:
        HWND videohwnd;
        CEvent e;
        CStatic    CAPVIDEO;
        BITMAPINFO *mapinfo;
        PBITMAPINFO tran;
    //补充下 在对话框的
    DoDataExchange方法中添加如下代码:
    DDX_Control(pDX, IDC_CAPVIDEO, CAPVIDEO);//绑定控件IDC_CAPVIDEO和变量
    
    

    3.打开摄像头按钮内的代码

        CRect rc;
        CAPVIDEO.GetWindowRect(&rc);
        ScreenToClient(rc);
    
        CAPDRIVERCAPS capd;
        CAPSTATUS caps;
        tran=NULL;
        e.ResetEvent();
        AfxBeginThread(vproc,(void*)this);
        ::WaitForSingleObject(e,INFINITE);
    
            if(capDriverConnect(videohwnd,0)==TRUE)
            {
            capDriverGetCaps(videohwnd,sizeof(CAPDRIVERCAPS),&capd);
            capGetStatus(videohwnd,&caps,sizeof(CAPSTATUS));
            ::SetParent(videohwnd,*this);
            
            ::SetWindowLong(videohwnd,GWL_STYLE,WS_CHILD);
            ::SetWindowPos(videohwnd,NULL,rc.left,rc.top,
                    rc.Width(),rc.Height(),SWP_NOZORDER);
            ::ShowWindow(videohwnd,SW_SHOW);
            //capPreviewScale(videohwnd,   1);   
            capPreviewRate(videohwnd,66);
            capPreview(videohwnd,true);    
            }
    
        else
        {
            AfxMessageBox("创建失败");
        }
        

    4.vproc方法

    static UINT vproc(LPVOID pParam)
    {

    CViewDialog *p=(CViewDialog*)pParam;

    HWND hwnd=capCreateCaptureWindow(NULL,WS_POPUP,0,0,10,10,0,0);
    if(hwnd)
    {
    p->videohwnd=hwnd;
    p->e.SetEvent();
    }
    MSG Msg;
    while(GetMessage(&Msg,NULL,0,0))
    {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
    }
    return Msg.wParam;

    }

    5.拍照按钮内的代码

    LPWSTR picUrl=_T("d:/123.bmp");
    capFileSaveDIB(videohwnd,picUrl);

    现在可以存出图了,但是bmp格式不常用,下次记录裁剪bmp和转换bmp为jpg.

    有一段弯路,图片控件ID默认是IDC_STATIC,开始没有修改初始化时报错因为ID重复,修改后就好了...

  • 相关阅读:
    UIWebView 本地缓存
    基于x86 Android ndk应用移植指南(android ndk 生成libs/x86)
    安装android的IntelHaxm.exe时出错的问题
    使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决
    犯傻似得的开发
    关于在win8下开发c或者c++时,某些特殊情况
    android 图片加载过多崩溃
    辞职的三十八个理由
    android程序的代码混淆打包
    几条常见的数据库建表id增长sql语句
  • 原文地址:https://www.cnblogs.com/kk1230/p/3718882.html
Copyright © 2020-2023  润新知