zoukankan      html  css  js  c++  java
  • C#学习笔记——摄像头

    界面:

    image

    源码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    //添加引用
    using System.Runtime.InteropServices;
    using System.Drawing.Imaging;
    
    namespace Camera
    {
        public partial class FormMain : Form
        {
            WebCamera wc;
            //声明一个API函数 
            [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
            private static extern bool BitBlt(
            IntPtr hdcDest, // 目标 DC的句柄 
            int nXDest,
            int nYDest,
            int nWidth,
            int nHeight,
            IntPtr hdcSrc, // 源DC的句柄 
            int nXSrc,
            int nYSrc,
            System.Int32 dwRop // 光栅的处理数值 
            );
    
            public FormMain()
           {
                InitializeComponent();
            }
    
            private void btnPlay_Click(object sender, EventArgs e)
            {
                btnPlay.Enabled = false;
                btnStop.Enabled = true;
                //panelPreview.Size = new Size(330, 330);
                wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);
                wc.StartWebCam();
            }
    
            private void FormMain_Load(object sender, EventArgs e)
            {
                btnPlay.Enabled = false;
                btnStop.Enabled = true;
                //panelPreview.Size = new Size(330, 330);
                wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);
                wc.StartWebCam();
            }
    
            private void btnStop_Click(object sender, EventArgs e)
            {
                btnPlay.Enabled = true;
                btnStop.Enabled = false;
                wc.CloseWebcam();
            }
    
            private void btnPhoto_Click(object sender, EventArgs e)
            {
                //创建一个以当前控件区域屏幕为模板的图象 
                Graphics gPanel = this.panelPreview.CreateGraphics();
    
                Bitmap bmSave = new Bitmap(this.panelPreview.Width, this.panelPreview.Height); //用于保存图片的位图对象
    
                Graphics gSave = Graphics.FromImage(bmSave);
    
                //得到屏幕的DC 
                IntPtr dcPanel = gPanel.GetHdc();
                //得到Bitmap的DC 
                IntPtr dcSave = gSave.GetHdc();
                //调用此API函数,实现屏幕捕获 
                BitBlt(dcSave, 0, 0, this.panelPreview.Width, this.panelPreview.Height, dcPanel, 0, 0, 13369376);
                //释放掉屏幕的DC 
                gPanel.ReleaseHdc(dcPanel);
                //释放掉Bitmap的DC 
                gSave.ReleaseHdc(dcSave);
                //以JPG文件格式来保存 
                bmSave.Save(@"D:/Photo.jpg", ImageFormat.Jpeg);
                MessageBox.Show("当前图像已经保存为D盘Photo文件!");
            }
        }
    
        //show Video class
        public class showVideo
        {
    
            // showVideo calls
            [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);
            [DllImport("User32.dll")]
            public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam);
            [DllImport("User32.dll")]
            public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref BITMAPINFO lParam);
            [DllImport("User32.dll")]
            public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
            [DllImport("avicap32.dll")]
            public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
    
            // Constants
            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;
    
            // Structures
            [StructLayout(LayoutKind.Sequential)]
            public struct VIDEOHDR
            {
                [MarshalAs(UnmanagedType.I4)]
                public int lpData;
    
                [MarshalAs(UnmanagedType.I4)]
                public int dwBufferLength;
    
                [MarshalAs(UnmanagedType.I4)]
                public int dwBytesUsed;
    
                [MarshalAs(UnmanagedType.I4)]
                public int dwTimeCaptured;
    
                [MarshalAs(UnmanagedType.I4)]
                public int dwUser;
    
                [MarshalAs(UnmanagedType.I4)]
                public int dwFlags;
    
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
                public int[] dwReserved;
    
            }
    
            [StructLayout(LayoutKind.Sequential)]
            public struct BITMAPINFOHEADER
            {
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biSize;
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biWidth;
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biHeight;
    
                [MarshalAs(UnmanagedType.I2)]
                public short biPlanes;
    
                [MarshalAs(UnmanagedType.I2)]
                public short biBitCount;
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biCompression;
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biSizeImage;
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biXPelsPerMeter;
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biYPelsPerMeter;
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biClrUsed;
    
                [MarshalAs(UnmanagedType.I4)]
                public Int32 biClrImportant;
    
            }
    
    
    
            [StructLayout(LayoutKind.Sequential)]
            public struct BITMAPINFO
            {
    
                [MarshalAs(UnmanagedType.Struct, SizeConst = 40)]
                public BITMAPINFOHEADER bmiHeader;
    
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
                public Int32[] bmiColors;
    
            }
    
    
    
            public delegate void FrameEventHandler(IntPtr lwnd, IntPtr lpVHdr);
    
    
    
            // Public methods
    
            public static object GetStructure(IntPtr ptr, ValueType structure)
            {
    
                return Marshal.PtrToStructure(ptr, structure.GetType());
    
            }
    
    
    
            public static object GetStructure(int ptr, ValueType structure)
            {
    
                return GetStructure(new IntPtr(ptr), structure);
    
            }
    
    
    
            public static void Copy(IntPtr ptr, byte[] data)
            {
    
                Marshal.Copy(ptr, data, 0, data.Length);
    
            }
    
    
    
            public static void Copy(int ptr, byte[] data)
            {
    
                Copy(new IntPtr(ptr), data);
    
            }
    
    
    
            public static int SizeOf(object structure)
            {
    
                return Marshal.SizeOf(structure);
    
            }
    
        }
    
    
    
        //Web Camera Class
    
        public class WebCamera
        {
    
            // Constructur
    
            public WebCamera(IntPtr handle, int width, int height)
            {
    
                mControlPtr = handle;
    
                mWidth = width;
    
                mHeight = height;
    
            }
    
    
    
            // delegate for frame callback
    
            public delegate void RecievedFrameEventHandler(byte[] data);
    
            public event RecievedFrameEventHandler RecievedFrame;
    
    
    
            private IntPtr lwndC; // Holds the unmanaged handle of the control
    
            private IntPtr mControlPtr; // Holds the managed pointer of the control
    
            private int mWidth;
    
            private int mHeight;
    
    
    
            private showVideo.FrameEventHandler mFrameEventHandler; // Delegate instance for the frame callback - must keep alive! gc should NOT collect it
    
    
    
            // Close the web camera
    
            public void CloseWebcam()
            {
    
                this.capDriverDisconnect(this.lwndC);
    
            }
    
    
    
            // start the web camera
    
            public void StartWebCam()
            {
    
                byte[] lpszName = new byte[100];
    
                byte[] lpszVer = new byte[100];
    
    
    
                showVideo.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100);
    
                this.lwndC = showVideo.capCreateCaptureWindowA(lpszName, showVideo.WS_VISIBLE + showVideo.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);
    
    
    
                if (this.capDriverConnect(this.lwndC, 0))
                {
    
                    this.capPreviewRate(this.lwndC, 66);
    
                    this.capPreview(this.lwndC, true);
    
                    showVideo.BITMAPINFO bitmapinfo = new showVideo.BITMAPINFO();
    
                    bitmapinfo.bmiHeader.biSize = showVideo.SizeOf(bitmapinfo.bmiHeader);
    
                    bitmapinfo.bmiHeader.biWidth = 352;
    
                    bitmapinfo.bmiHeader.biHeight = 288;
    
                    bitmapinfo.bmiHeader.biPlanes = 1;
    
                    bitmapinfo.bmiHeader.biBitCount = 24;
    
                    this.capSetVideoFormat(this.lwndC, ref bitmapinfo, showVideo.SizeOf(bitmapinfo));
    
                    this.mFrameEventHandler = new showVideo.FrameEventHandler(FrameCallBack);
    
                    this.capSetCallbackOnFrame(this.lwndC, this.mFrameEventHandler);
    
                    showVideo.SetWindowPos(this.lwndC, 0, 0, 0, mWidth, mHeight, 6);
    
                }
    
            }
    
    
    
            // private functions
    
            private bool capDriverConnect(IntPtr lwnd, short i)
            {
    
                return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_CONNECT, i, 0);
    
            }
    
    
    
            private bool capDriverDisconnect(IntPtr lwnd)
            {
    
                return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_DISCONNECT, 0, 0);
    
            }
    
    
    
            private bool capPreview(IntPtr lwnd, bool f)
            {
    
                return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEW, f, 0);
    
            }
    
    
    
            private bool capPreviewRate(IntPtr lwnd, short wMS)
            {
    
                return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEWRATE, wMS, 0);
    
            }
    
    
    
            private bool capSetCallbackOnFrame(IntPtr lwnd, showVideo.FrameEventHandler lpProc)
            {
    
                return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_CALLBACK_FRAME, 0, lpProc);
    
            }
    
    
    
            private bool capSetVideoFormat(IntPtr hCapWnd, ref showVideo.BITMAPINFO BmpFormat, int CapFormatSize)
            {
    
                return showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_SET_VIDEOFORMAT, CapFormatSize, ref BmpFormat);
    
            }
    
    
    
            private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr)
            {
    
                showVideo.VIDEOHDR videoHeader = new showVideo.VIDEOHDR();
    
                byte[] VideoData;
    
                videoHeader = (showVideo.VIDEOHDR)showVideo.GetStructure(lpVHdr, videoHeader);
    
                VideoData = new byte[videoHeader.dwBytesUsed];
    
                showVideo.Copy(videoHeader.lpData, VideoData);
    
                if (this.RecievedFrame != null)
    
                    this.RecievedFrame(VideoData);
    
            }
    
        }
    
    
    
    }

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    centos 安装 TortoiseSVN svn 客户端
    linux 定时任务 日志记录
    centos6.5 安装PHP7.0支持nginx
    linux root 用户 定时任务添加
    composer 一些使用说明
    laravel cookie写入
    laravel composer 安装指定版本以及基本的配置
    mysql 删除重复记录语句
    linux php redis 扩展安装
    linux php 安装 memcache 扩展
  • 原文地址:https://www.cnblogs.com/jqmtony/p/2910872.html
Copyright © 2011-2022 走看看