| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2568 人关注过本帖
标题:如何控制摄像头上的拍照按钮
只看楼主 加入收藏
cgsgb
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-4-24
结帖率:0
收藏
已结贴  问题点数:10 回复次数:5 
如何控制摄像头上的拍照按钮
有些时候离电脑比较远不好拍照,所以有些摄像头上自带了一个拍照按钮,如何在C#中控制这个按钮,当它按下的时候将捕获到的图像显示到指定的picturebox中啊。望高手指点,不胜感激,谢谢!!
小弟刚来比较穷就给10分吧


[ 本帖最后由 cgsgb 于 2010-4-24 12:10 编辑 ]
搜索更多相关主题的帖子: 摄像头 按钮 拍照 
2010-04-24 12:08
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
收藏
得分:5 
要有这个摄像头的驱动才行吧,看看这个驱动有没接口/API之类的

站在春哥的肩膀上
2010-04-27 14:02
athenalux
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河北石家庄
等 级:小飞侠
威 望:8
帖 子:975
专家分:2514
注 册:2008-11-26
收藏
得分:5 
这个好像要用avicap32.dll中的函数来做,但找不到此文件的使用说明。楼主如果找到了,发上来大家共享。

QQ:81704464
2010-04-27 14:15
cgsgb
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-4-24
收藏
得分:0 
不会啊,我看XP都可以做到,像ACDSEE,PS都可以做到啊,他们是如何做到的呢
2010-04-27 21:48
athenalux
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河北石家庄
等 级:小飞侠
威 望:8
帖 子:975
专家分:2514
注 册:2008-11-26
收藏
得分:0 
找到了点东东,看看吧,希望楼主能成功。
using system;
using System.Runtime.InteropServices;

namespace webcam
{
///
/// avicap 的摘要说明。
///
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);
}
}

}

具体调用如下:

using system;
using System.Drawing;
using System.Collections;
using
using System.Windows.Forms;
using System.Data;
using webcam;

namespace webcam
{
///
/// Form1 的摘要说明。
///
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Panel panelPreview;
private System.Windows.Forms.Button b_play;
private System.Windows.Forms.Button b_stop;
///
/// 必需的设计器变量。
///
private components = null;
WebCamera wc;

public form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

///
/// 清理所有正在使用的资源。
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region windows 窗体设计器生成的代码
///
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
///
private void InitializeComponent()
{
this.b_play = new System.Windows.Forms.Button();
this.panelPreview = new System.Windows.Forms.Panel();
this.b_stop = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// b_play
//
this.b_play.Location = new System.Drawing.Point(280, 368);
this.b_play.Name = "b_play";
this.b_play.TabIndex = 0;
this.b_play.Text = "&Play";
this.b_play.Click += new System.EventHandler(this.button1_Click);
//
// panelPreview
//
this.panelPreview.Location = new System.Drawing.Point(8, 8);
this.panelPreview.Name = "panelPreview";
this.panelPreview.Size = new System.Drawing.Size(344, 272);
this.panelPreview.TabIndex = 1;
//
// b_stop
//
this.b_stop.Enabled = false;
this.b_stop.Location = new System.Drawing.Point(360, 368);
this.b_stop.Name = "b_stop";
this.b_stop.TabIndex = 2;
this.b_stop.Text = "&Stop";
this.b_stop.Click += new System.EventHandler(this.b_stop_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(464, 413);
this.Controls.Add(this.b_stop);
this.Controls.Add(this.panelPreview);
this.Controls.Add(this.b_play);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Form1";
this.Text = "GoodView test Web Camera";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void form1_load(object sender, system.eventargs e)
{
b_play.Enabled = false;
b_stop.Enabled = true;
panelPreview.Size = new Size(330,330);
wc = new WebCamera( panelPreview.Handle,panelPreview.Width,panelPreview.Height);
wc.StartWebCam();
}

private void button1_click(object sender, system.eventargs e)
{
b_play.Enabled = false;
b_stop.Enabled = true;
panelPreview.Size = new Size(330,330);
wc = new WebCamera( panelPreview.Handle,panelPreview.Width,panelPreview.Height);
wc.StartWebCam();
}

private void b_stop_click(object sender, system.eventargs e)
{
b_play.Enabled = true;
b_stop.Enabled = false;
wc.CloseWebcam();
}
}
}

QQ:81704464
2010-04-28 09:00
cgsgb
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-4-24
收藏
得分:0 
回复 5楼 athenalux
谢谢5楼兄弟,回去好好试试!
2010-05-07 07:08
快速回复:如何控制摄像头上的拍照按钮
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022174 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved