摄像头抓取图片的程序

    技术2022-05-19  22

    using System;  using System.IO;  using System.Drawing.Imaging;  using System.Runtime.InteropServices;  using System.Drawing;  using System.Collections;  using System.Data;    namespace SoundVideo  {         public class Camera      {          public delegate void RecievedFrameEventHandler(byte[] data);          public event RecievedFrameEventHandler RecievedFrame;            public IntPtr lwndC;          private IntPtr mControlPtr;          private int mWidth;          private int mHeight; 

            private showVideo.FrameEventHandler mFrameEventHandler;            public Camera(IntPtr handle, int width, int height)          {              mControlPtr = handle;              mWidth = width;              mHeight = height;          }            public void CloseCamera()          {              this.capDriverDisconnect(this.lwndC);          }            public void StartCamera(int width ,int height)          {              try              {                  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 = width;//352;                      bitmapinfo.bmiHeader.biHeight = height;// 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);                  }              }              catch              {                  throw;              }          }            public void bitMapToJPG(string bmpFileName, string jpgFileName)          {              System.Drawing.Image img;              img = ReturnPhoto(bmpFileName);              img.Save(jpgFileName, ImageFormat.Jpeg);          }          private Image ReturnPhoto(string bmpFileName)          {              try              {                  System.IO.FileStream stream;                  stream = File.OpenRead(bmpFileName);                  Bitmap bmp = new Bitmap(stream);                  System.Drawing.Image image = bmp;//得到原图                    //创建指定大小的图                  System.Drawing.Image newImage = image.GetThumbnailImage(bmp.Width, bmp.Height, null, new IntPtr());                  Graphics g = Graphics.FromImage(newImage);                  g.DrawImage(newImage, 0, 0, newImage.Width, newImage.Height); //将原图画到指定的图上                  g.Dispose();                  stream.Close();                    return newImage;              }              catch              {                  throw;              }          }          public void capImage(IntPtr lwnd, string path)//抓图          {              showVideo.BITMAPINFO bitmapinfo = new showVideo.BITMAPINFO();              IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);              showVideo.SendMessage(lwnd, showVideo.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());            }          public void capScope(IntPtr lwnd, string path)// 录像,保存avi文件的路径          {              IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);              showVideo.SendMessage(lwnd, showVideo.WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt32());              showVideo.SendMessage(lwnd, showVideo.WM_CAP_SEQUENCE, 0, 0);          }          public void stopCapScope(IntPtr lwnd)// 停止录像          {              showVideo.SendMessage(lwnd, showVideo.WM_CAP_STOP, 0, 0);          }          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)          {              try              {                  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);              }              catch              {                  throw;              }          }        }

        public class showVideo    {        [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);

            public const int WM_USER = 0x400;        public const int WS_CHILD = 0x40000000;        public const int WS_VISIBLE = 0x10000000;        public const int WM_CAP_START = WM_USER;        public const int WM_CAP_STOP = WM_CAP_START + 68;        public const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;        public const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;        public const int WM_CAP_SAVEDIB = WM_CAP_START + 25;        public const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;        public const int WM_CAP_SEQUENCE = WM_CAP_START + 62;        public const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;        public const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;        public const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;        public const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;        public const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;        public const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;        public const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;        public const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;        public const int WM_CAP_SET_SCALE = WM_CAP_START + 53;        public const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;        public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;

            [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 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);        }    }  } 


    最新回复(0)