C#打开摄像头抓取照片然后退出

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics; namespace MyVideoService
{
class Program
{ static void Main(string[] args)
{
cVideo video = new cVideo(Process.GetCurrentProcess().MainWindowHandle, , );
video.StartWebCam();
video.GrabImage(Process.GetCurrentProcess().MainWindowHandle, "d:\\b.jpg");
video.CloseWebcam();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.Drawing;
using System.IO; namespace MyVideoService
{
public class VideoAPI //视频API类
{
// 视频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 + ;
public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + ;
public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + ;
public const int WM_CAP_SET_PREVIEW = WM_USER + ;
public const int WM_CAP_SET_PREVIEWRATE = WM_USER + ;
public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + ;
public const int WM_CAP_START = WM_USER;
public const int WM_CAP_SAVEDIB = WM_CAP_START + ;
}
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[];
byte[] lpszVer = new byte[];
VideoAPI.capGetDriverDescriptionA(, lpszName, , lpszVer, );
this.lwndC = VideoAPI.capCreateCaptureWindowA(lpszName, VideoAPI.WS_CHILD | VideoAPI.WS_VISIBLE, , , mWidth, mHeight, mControlPtr, );
if (VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_CONNECT, , ))
{
VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEWRATE, , );
VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEW, true, );
}
}
/// <summary>
/// 关闭视频设备
/// </summary>
public void CloseWebcam()
{
VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_DISCONNECT, , );
}
/// <summary>
/// 拍照
/// </summary>
/// <param name="path">要保存jpeg文件的路径</param>
public void GrabImage(IntPtr hWndC, string path)
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SAVEDIB, , hBmp.ToInt32()); Bitmap image = new Bitmap(path);
if (path.Contains("bmp"))
{
image.Save(path.Replace("bmp", "jpg"), ImageFormat.Jpeg);
image.Dispose();
if (System.IO.File.Exists(path))
{
try
{
System.IO.File.Delete(path);
}
catch (System.IO.IOException e)
{
return;
}
}
else {
image.Save(path, ImageFormat.Jpeg);
image.Dispose();
} } }
} }

补上这一个,是因为在VFW的系列教程中有人反映截图的问题。 我原来的方案是btye转换。 现在通过dll直接做byte的图片输入。 更方便。

            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SAVEDIB, , hBmp.ToInt32());

这个文章来源: 开源中国。 转帖是北洋螃蟹
上一篇:[TypeScript] Using Lodash in TypeScript with Typings and SystemJS


下一篇:HTTP及网络安全