c#访问摄像头-c# winform 访问摄像头照片

问题描述

c# winform 访问摄像头照片
public Form1()
        {
            InitializeComponent();
        }
        cVideo video;
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            video = new cVideo(pictureBox1.Handle, pictureBox1.Width, pictureBox1.Height);

            video.StartWebCam();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            video.CloseWebcam();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            video.GrabImage(video.GetIntPtr(), "d:\a.bmp");
        }
    }

    public class VideoAPI
    {

        // 视频API调用

        [DllImport("avicap32.dll")]

        public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName,

            int dwStyle, int x, int y, int nWidth, int nHeight,

            IntPtr hWndParent, int nID);

        [DllImport("avicap32.dll")]

        public static extern bool capGetDriverDescriptionA(short wDriver,

            byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);

        [DllImport("User32.dll")]

        public static extern bool SendMessage(IntPtr hWnd, int wMsg,

            bool wParam, int lParam);

        [DllImport("User32.dll")]

        public static extern bool SendMessage(IntPtr hWnd, int wMsg,

            short wParam, int lParam);

        // 常量

        public const int WM_USER = 0x400;

        public const int WS_CHILD = 0x40000000;

        public const int WS_VISIBLE = 0x10000000;

        public const int SWP_NOMOVE = 0x2;

        public const int SWP_NOZORDER = 0x4;

        public const int WM_CAP_DRIVER_CONNECT = WM_USER + 10;

        public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;

        public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + 5;

        public const int WM_CAP_SET_PREVIEW = WM_USER + 50;

        public const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;

        public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;

        public const int WM_CAP_START = WM_USER;

        public const int WM_CAP_SAVEDIB = WM_CAP_START + 25;

    }

    public class cVideo
    {

        private IntPtr lwndC;       //保存无符号句柄

        private IntPtr mControlPtr; //保存管理指示器

        private int mWidth;

        private int mHeight;

        public cVideo(IntPtr handle, int width, int height)
        {

            mControlPtr = handle; //显示视频控件的句柄

            mWidth = width;      //视频宽度

            mHeight = height;    //视频高度

        }

        /// <summary>

        /// 打开视频设备

        /// </summary>

        public void StartWebCam()
        {

            byte[] lpszName = new byte[100];

            byte[] lpszVer = new byte[100];

            VideoAPI.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100);

            this.lwndC = VideoAPI.capCreateCaptureWindowA(lpszName,

                VideoAPI.WS_CHILD | VideoAPI.WS_VISIBLE, 0, 0,

                mWidth, mHeight, mControlPtr, 0);

            if (VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_CONNECT, 0, 0))
            {

                VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEWRATE, 100, 0);

                VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEW, true, 0);

            }

        }

        public IntPtr GetIntPtr()
        {
            byte[] lpszName = new byte[100];

            return VideoAPI.capCreateCaptureWindowA(lpszName,

               VideoAPI.WS_CHILD | VideoAPI.WS_VISIBLE, 0, 0,

               mWidth, mHeight, mControlPtr, 0);
        }
        /// <summary>

        /// 关闭视频设备

        /// </summary>

        public void CloseWebcam()
        {

            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_DISCONNECT, 0, 0);

        }

        ///   <summary>  

        ///   拍照

        ///   </summary>  

        ///   <param   name="path">要保存bmp文件的路径</param>  

        public void GrabImage(IntPtr hWndC, string path)
        {

            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());

        }

    }

怎么获取不到图像?????

解决方案

先不要那么复杂,就执行你的连接摄像头打开显示在图片框的代码,能不能执行,摄像头驱动有没有装好,摄像头有没有插好。

解决方案二:

我的是笔记本,自带摄像头,点击打开后,摄像头的灯都开了的,但图片框变成黑色了

解决方案三:

用第三方程序能看到图像么?另外系统中同时只能有一个程序访问摄像头。看看别的程序是不是关了。
最后,检查摄像头是否被物体遮挡

解决方案四:

this.lwndC = VideoAPI.capCreateCaptureWindowA(lpszName,

            VideoAPI.WS_CHILD | VideoAPI.WS_VISIBLE, 0, 0,

            mWidth, mHeight, mControlPtr, 0);

                            调试下这里,返回什么

解决方案五:

if (VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_CONNECT, 0, 0))
之后走入了判断分支了么?

解决方案六:

说明摄像头是可以工作的,代码也没有问题,你重启下电脑再试试,或者换一个摄像头看看

时间: 2024-08-30 14:11:16

c#访问摄像头-c# winform 访问摄像头照片的相关文章

强迫Twitter用户必须点击链接,访问Instagram网站,才能查看照片

红杉资本合伙人.Instagram投资者道格·利昂(Doug Leone)接受媒体采访时表示,Instagram出售时机过早.就在Facebook今年4月宣布斥资10亿美元收购Instagram的前几天,红杉资本刚刚领投了该公司的5000万美元融资.但利昂认为,Instagram"卖得太早了".他说:"对创始人而言,10亿美元听起来很多.但想想Instagram的潜力就不多了,它可以成为手机市场的下一个Facebook."红杉资本通过这笔交易将投资翻番,但Insta

使用delphi 开发多层应用(十八)使用Basic4android 访问RTC 服务的二进制流(照片)

    上次写了b4a 通过xmlrpc 访问rtc 的远程服务,有网友询问如何通过b4a 访问RTC web 的二进制流,例如如何下载 服务器上的照片,其实访问二进制流和访问字符串类似,不同的地方是,由于是通过http 协议,对于二进制流,需要先转换成 base64 编码,到客户端后再再把base64 转换回去成二进制码,就可以了.(注:由于RTC 的bug,需要RTC 6.08 以上的版本)    RTC服务器端的代码如下: procedure TForm1.RtcFunction3Exec

如何打开Win8摄像头和设置Win8摄像头的方法

Win8是目前最新的电脑操作系统,很多新购买的电脑都开始采用了最新的Win8系统,并且不少Win7用户也进行了升级,随着Win8市场占有率不断提升.随着带来的问题也不少,不少网友 Win8摄像头怎么打开.以前我们在XP系统可以在我的电脑中找到摄像头快捷方式,可以快速打开电脑摄像头,但从Win7开始,系统已经在计算机当中隐藏了摄像头,并且在Win8中,摄像头隐藏的更深. 那么Win8摄像头怎么打开呢?以下XP系统下载之家小编为大家介绍两种打开Win8摄像头的方法,Win8小白朋友快来学习一下吧.

数据库访问与本地文件访问实测报告

访问|数据|数据库 一直认为数据库访问比本地文件访问是要慢很多的,但究竟慢多少却不清楚.终于忍不住作了下比较测试. 测试环境:OS---Windows 2000 Server DatabaseServer----SQLServer 2000 程序语言:CSharp 测试方式:从数据库中读取参数表/从XML中读取配置参数等同数量的记录并实例化对象. 测试程序如下: using System; using System.Globalization; using System.IO; using Sy

acl-如何用C++ winsock 编程在服务器端实现访问控制,例如允许某IP访问网络、禁止访问网络

问题描述 如何用C++ winsock 编程在服务器端实现访问控制,例如允许某IP访问网络.禁止访问网络 如题 想在服务器端跑winsock,来模拟路由器的禁止访问.允许访问的功能, 不知道该如何做,思路我有,但是我找不到具体的API或者源码,求指点主要函数以及参考文档 解决方案 winsock没有这个功能,需要用raw socket,因为你这个需要在ip层处理. 解决方案二: 可以参考各种proxy的实现,比如apche等,然后自己获取IP地址等来做策略 解决方案三: 使用 winsock 只

opencv-用OpenCV2 打开多摄像头,如何确定摄像头序号

问题描述 用OpenCV2 打开多摄像头,如何确定摄像头序号 这是个小问题. 按照OpenCV说明书的说法,打开摄像头,可以使用如下语句形式: VideoCapture::VideoCapture(int device) 对于其中的device部分,说明手册有如下提示 device – id of the opened video capturing device (i.e. a camera index). 我想问的是,使用多个摄像头时,如何确定各个摄像头所对应的id. 比如,当有两个摄像头时

js打开摄像头拍照保存,摄像头镜像。摄像头可以识别二维码功能

问题描述 js打开摄像头拍照保存,摄像头镜像.摄像头可以识别二维码功能 js打开摄像头拍照保存.摄像头镜像.摄像头可以识别二维码功能.求大神回答~ 解决方案 这个需要和安卓或者ios开发人员合作,安卓或者ios给实现二维码扫描功能,和js交互,提供给你js方法.供你调用,你就可以识别二维码了. 解决方案二: 可以先不考虑二维码扫描

jsp java tomcat-jsp项目 web服务器本机无法访问 其他机器可以访问

问题描述 jsp项目 web服务器本机无法访问 其他机器可以访问 jsp ssh框架 tomcat6.0发布web服务 服务器本机ip+端口号无法访问 其他机器可以访问 防火墙没有问题,ip地址为固定,原本好好的忽然无法访问了,本机ip:端口号 访问提示无法访问 , localhost:端口号 可以访问,ie浏览器无法访问 ,火狐可以. 解决方案 把你的tomcat卸了再装一次看看怎么样

局域网-tomcat安装在server服务器上并部署java web项目,自身能访问但其他机器访问失败

问题描述 tomcat安装在server服务器上并部署java web项目,自身能访问但其他机器访问失败 在64位的server服务器上(IP:18.1.1.231)放了tomcat6.0.37,免安装版,在其上部署了java web项目SYXM,打开服务器的浏览器中,http://localhost:8080/SYXM,http://18.1.1.231:8080/SYXM,http://127.0.0.1:8080/SYXM,都可以访问 但是在自己的台式机上(IP:192.168.150.4