From: http://blog.csdn.net/ysq5202121/article/details/5672291
Camera.cs类文件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(){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 = 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);}}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;}}}
}ShowVideo.cs类文件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 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);}}
}Form1.cs类文件using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace SoundVideo
{public partial class Form1 : Form{Camera wc;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){try{this.btnPlay.Enabled = false;this.btnClose.Enabled = true;//panelPreview.Size = new Size(330,330);wc = new Camera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);wc.StartCamera();}catch{MessageBox.Show("打开摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnPlay_Click(object sender, EventArgs e){try{this.btnPlay.Enabled = false;this.btnClose.Enabled = true;wc = new Camera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);wc.StartCamera();}catch{MessageBox.Show("打开摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnScroll_Click(object sender, EventArgs e){try{wc.capImage(wc.lwndC, "d://test.bmp");}catch{MessageBox.Show("抓图有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnStopCap_Click(object sender, EventArgs e){try{wc.stopCapScope(wc.lwndC);}catch{MessageBox.Show("停止摄像有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnStartCap_Click(object sender, EventArgs e){try{wc.capScope(wc.lwndC, "d://test.avi");}catch{MessageBox.Show("开始摄像有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnClose_Click(object sender, EventArgs e){try{this.btnPlay.Enabled = true;this.btnClose.Enabled = false;wc.CloseCamera();}catch{MessageBox.Show("关闭摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}}
}using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace SoundVideo
{public partial class Form1 : Form{Camera wc;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){try{this.btnPlay.Enabled = false;this.btnClose.Enabled = true;//panelPreview.Size = new Size(330,330);wc = new Camera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);wc.StartCamera();}catch{MessageBox.Show("打开摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnPlay_Click(object sender, EventArgs e){try{this.btnPlay.Enabled = false;this.btnClose.Enabled = true;wc = new Camera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);wc.StartCamera();}catch{MessageBox.Show("打开摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnScroll_Click(object sender, EventArgs e){try{wc.capImage(wc.lwndC, "d://test.bmp");}catch{MessageBox.Show("抓图有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnStopCap_Click(object sender, EventArgs e){try{wc.stopCapScope(wc.lwndC);}catch{MessageBox.Show("停止摄像有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnStartCap_Click(object sender, EventArgs e){try{wc.capScope(wc.lwndC, "d://test.avi");}catch{MessageBox.Show("开始摄像有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnClose_Click(object sender, EventArgs e){try{this.btnPlay.Enabled = true;this.btnClose.Enabled = false;wc.CloseCamera();}catch{MessageBox.Show("关闭摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}}
}Form1.Designer.cs类文件namespace SoundVideo
{partial class Form1{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.panel1 = new System.Windows.Forms.Panel();this.btnStartCap = new System.Windows.Forms.Button();this.btnStopCap = new System.Windows.Forms.Button();this.btnScroll = new System.Windows.Forms.Button();this.btnPlay = new System.Windows.Forms.Button();this.btnClose = new System.Windows.Forms.Button();this.panelPreview = new System.Windows.Forms.Panel();this.panel2 = new System.Windows.Forms.Panel();this.panel1.SuspendLayout();this.panel2.SuspendLayout();this.SuspendLayout();//// panel1//this.panel1.Controls.Add(this.panel2);this.panel1.Controls.Add(this.panelPreview);this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;this.panel1.Location = new System.Drawing.Point(0, 0);this.panel1.Name = "panel1";this.panel1.Size = new System.Drawing.Size(518, 487);this.panel1.TabIndex = 0;//// btnStartCap//this.btnStartCap.Location = new System.Drawing.Point(51, 3);this.btnStartCap.Name = "btnStartCap";this.btnStartCap.Size = new System.Drawing.Size(75, 23);this.btnStartCap.TabIndex = 0;this.btnStartCap.Text = "开始录像";this.btnStartCap.UseVisualStyleBackColor = true;this.btnStartCap.Click += new System.EventHandler(this.btnStartCap_Click);//// btnStopCap//this.btnStopCap.Location = new System.Drawing.Point(132, 3);this.btnStopCap.Name = "btnStopCap";this.btnStopCap.Size = new System.Drawing.Size(75, 23);this.btnStopCap.TabIndex = 1;this.btnStopCap.Text = "停止录像";this.btnStopCap.UseVisualStyleBackColor = true;this.btnStopCap.Click += new System.EventHandler(this.btnStopCap_Click);//// btnScroll//this.btnScroll.Location = new System.Drawing.Point(213, 3);this.btnScroll.Name = "btnScroll";this.btnScroll.Size = new System.Drawing.Size(75, 23);this.btnScroll.TabIndex = 2;this.btnScroll.Text = "抓图";this.btnScroll.UseVisualStyleBackColor = true;this.btnScroll.Click += new System.EventHandler(this.btnScroll_Click);//// btnPlay//this.btnPlay.Location = new System.Drawing.Point(294, 3);this.btnPlay.Name = "btnPlay";this.btnPlay.Size = new System.Drawing.Size(75, 23);this.btnPlay.TabIndex = 3;this.btnPlay.Text = "播放";this.btnPlay.UseVisualStyleBackColor = true;this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);//// btnClose//this.btnClose.Location = new System.Drawing.Point(375, 3);this.btnClose.Name = "btnClose";this.btnClose.Size = new System.Drawing.Size(75, 23);this.btnClose.TabIndex = 4;this.btnClose.Text = "关闭";this.btnClose.UseVisualStyleBackColor = true;this.btnClose.Click += new System.EventHandler(this.btnClose_Click);//// panelPreview//this.panelPreview.Dock = System.Windows.Forms.DockStyle.Fill;this.panelPreview.Location = new System.Drawing.Point(0, 0);this.panelPreview.Name = "panelPreview";this.panelPreview.Size = new System.Drawing.Size(518, 487);this.panelPreview.TabIndex = 5;//// panel2//this.panel2.Controls.Add(this.btnStartCap);this.panel2.Controls.Add(this.btnStopCap);this.panel2.Controls.Add(this.btnClose);this.panel2.Controls.Add(this.btnScroll);this.panel2.Controls.Add(this.btnPlay);this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;this.panel2.Location = new System.Drawing.Point(0, 448);this.panel2.Name = "panel2";this.panel2.Size = new System.Drawing.Size(518, 39);this.panel2.TabIndex = 6;//// Form1//this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(518, 487);this.Controls.Add(this.panel1);this.Name = "Form1";this.Text = "Form1";this.Load += new System.EventHandler(this.Form1_Load);this.panel1.ResumeLayout(false);this.panel2.ResumeLayout(false);this.ResumeLayout(false);}#endregionprivate System.Windows.Forms.Panel panel1;private System.Windows.Forms.Button btnClose;private System.Windows.Forms.Button btnPlay;private System.Windows.Forms.Button btnScroll;private System.Windows.Forms.Button btnStopCap;private System.Windows.Forms.Button btnStartCap;private System.Windows.Forms.Panel panelPreview;private System.Windows.Forms.Panel panel2;}
}