C#2008 代码 控制USB摄像头 ,不能显示图像?

215 篇文章 2 订阅
120 篇文章 3 订阅

作者:为什么呢

转自:http://bbs.gimoo.net/thread/129939-1.html


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;
namespace Temp
{
public partial class frmCamera : Form
{
public frmCamera()
{
InitializeComponent();
pcc = new Camera.PCCamera(this.panelCamera.Handle, 0, 0, 320, 240);
}
private Camera.PCCamera pcc;
//开始
private void btnStart_Click(object sender, EventArgs e)
{
pcc.Start();
}
//停止
private void btnStop_Click(object sender, EventArgs e)
{
pcc.Stop();
}
//截图
private void btnSaveImage_Click(object sender, EventArgs e)
{
Application.DoEvents();
pcc.GrabImage("c:\\" + System.DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg");
}
//录像
private void btnKinescope_Click(object sender, EventArgs e)
{
pcc.Kinescope("c:\\" + System.DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi");
}
//停止录像
private void btnStopKinescope_Click(object sender, EventArgs e)
{
Application.DoEvents();
pcc.StopKinescope();
}
}
}
namespace Camera
{
///
/// 一个控制摄像头的类
///
public class PCCamera
{
private const int WM_USER = 0x400;
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
private const int WM_CAP_START = WM_USER;
private const int WM_CAP_STOP = WM_CAP_START + 68;
private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
private const int WM_CAP_SET_SCALE = WM_CAP_START + 53;
private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
private IntPtr hWndC;
private IntPtr mControlPtr;
private bool bWorkStart = false;
private int mWidth;
private int mHeight;
private int mLeft;
private int mTop;
///
/// 初始化显示图像
///
/// 控件的句柄
/// 开始显示的左边距
/// 开始显示的上边距
/// 要显示的宽度
/// 要显示的长度
public PCCamera(IntPtr handle, int left, int top, int width, int height)
{
mControlPtr = handle;
mWidth = width;
mHeight = height;
mLeft = left;
mTop = top;
}
[DllImport("avicap32.dll")]
private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
[DllImport("avicap32.dll")]
private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
[DllImport("User32.dll")]
private static extern bool SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
///
/// 开始显示图像
///
public void Start()
{
if (bWorkStart)
{
return;
}
bWorkStart = true;
byte[] lpszName = new byte[100];
hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);
if (hWndC.ToInt32() != 0)
{
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, IntPtr.Zero, IntPtr.Zero);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, IntPtr.Zero, IntPtr.Zero);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, IntPtr.Zero, IntPtr.Zero);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, IntPtr.Zero, IntPtr.Zero);
SendMessage(hWndC, WM_CAP_SET_SCALE, (IntPtr)1, IntPtr.Zero);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, (IntPtr)66, IntPtr.Zero);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, (IntPtr)1, IntPtr.Zero);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, (IntPtr)1, IntPtr.Zero);
}
return;
}
///
/// 停止显示图像
///
public void Stop()
{
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, IntPtr.Zero, IntPtr.Zero);
bWorkStart = false;
}
///
/// 抓图
///
/// 要保存bmp文件的路径
public void GrabImage(string path)
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC, WM_CAP_SAVEDIB, IntPtr.Zero, hBmp);
}
///
///录像
///
///要保存avi文件的路径
public void Kinescope(string path)
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, IntPtr.Zero, hBmp);
SendMessage(hWndC, WM_CAP_SEQUENCE, IntPtr.Zero, IntPtr.Zero);
}
///
///停止录像
///
public void StopKinescope()
{
SendMessage(hWndC, WM_CAP_STOP, IntPtr.Zero, IntPtr.Zero);
}
}
}
问题是运行程序在点及 “开始” 按扭后在panel 区域不能显示图像,panel 显示为黑色。当然也就不能截图和录像了。


shunqiziran

给你一个我小改过的Camera类。
C# code
public class Camera
{
private const int WM_USER = 0x400;
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
private const int WM_CAP_START = WM_USER;
private const int WM_CAP_STOP = WM_CAP_START + 68;
private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
private const int WM_CAP_CUTIMAGE = 0x41e; //剪切当前图像
private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
private const int WM_CAP_SET_SCALE = WM_CAP_START + 53;
private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
private const int WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41;
private const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;
private const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43;
private const int WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46;
private IntPtr hWndC;
private bool bStat = false;
private IntPtr mControlPtr;
private int mWidth;
private int mHeight;
private int mLeft;
private int mTop;
///
/// 初始化摄像头
///
/// 控件的句柄
/// 开始显示的左边距
/// 开始显示的上边距
/// 要显示的宽度
/// 要显示的长度
public Camera(IntPtr handle, int left, int top, int width, int height)
{
mControlPtr = handle;
mWidth = width;
mHeight = height;
mLeft = left;
mTop = top;
}
[DllImport("avicap32.dll")]
//private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
private static extern IntPtr capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
[DllImport("avicap32.dll")]
private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
[DllImport("User32.dll")]
private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, long lParam);
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern bool DestroyWindow(int hndw);
private void capDlgVideoFormat()
{
Boolean capDlgVideoFormat = SendMessage(hWndC, WM_CAP_DLG_VIDEOFORMAT, 0, 0);
}
private void capDlgVideoSource()
{
Boolean capDlgVideoSource = SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0);
}
private void capDlgVideoDisplay()
{
Boolean capDlgVideoDisplay = SendMessage(hWndC, WM_CAP_DLG_VIDEODISPLAY, 0, 0);
}
private void capDlgVideoCompression()
{
Boolean capDlgVideoCompression = SendMessage(hWndC, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0);
}
///
/// 开始显示图像
///
public void Start()
{
if (bStat)
return;
bStat = true;
byte[] lpszName = new byte[100];
//hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);
int intDevice = 0;
string refDevice = intDevice.ToString();
hWndC = capCreateCaptureWindowA(ref refDevice,
1342177280,
mLeft,
mTop,
mWidth,
mHeight,
mControlPtr,
0);
//Console.WriteLine("驱动:" + refDevice);
if (SendMessage(hWndC, 0x40a, intDevice, 0))
{
//Console.WriteLine("摄像头正常");
}
else
{
//Console.WriteLine("未检测到摄像头");
throw new PCCameraException();
}
if (hWndC.ToInt32() != 0)
{
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
}
return;
}
///
/// 停止显示
///
public void Stop()
{
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
bStat = false;
}
///
/// 抓图
///
/// 要保存文件的路径
public void GrabImage(string path)
{
try
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
//SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64()); //该方式无法控制保存图像格式
SendMessage(hWndC, WM_CAP_CUTIMAGE, 0, 0);
System.Windows.Forms.IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject.GetDataPresent(typeof(Bitmap)))
{
Image img = (Image)dataObject.GetData(typeof(Bitmap));
img.Save(path, ImageFormat.Jpeg);
}
}
catch (Exception exc)
{
throw new CameraException(exc);
}
}
///
/// 录像
///
/// 要保存avi文件的路径
public void Kinescope(string path)
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
}
///
/// 停止录像
///
public void StopKinescope()
{
SendMessage(hWndC, WM_CAP_STOP, 0, 0);
}
///
/// 打开属性设置对话框,设置对比度、亮度等。
/// (视频源对话框) 选择视频输入通道和视频图像的动态参数。
///
public void ShowConfig()
{
SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0);
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值