简单介绍C#获取摄像头拍照显示图像的方法
这篇文章主要为大家详细介绍了C#获取摄像头拍照显示图像的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 |
本文实例为大家分享了C#获取摄像头拍照显示图像的具体代码,供大家参考,具体内容如下
概述
之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户。
其实本质就是保存图像二维码,在进行二维码识别。
下面来看看如何实现。
主要代码实现
1、初始化摄像头
/// < summary>/// 初始化摄像头/// < /summary>/// < param name="handle">控件的句柄/// < param name="left">开始显示的左边距/// < param name="top">开始显示的上边距/// < param name="width">要显示的宽度/// < param name="height">要显示的长度public Pick(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, int wParam, long lParam);
2、开始显示图像
/// < summary>/// 开始显示图像/// < /summary>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);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;}
3、停止显示
/// < summary>/// 停止显示/// < /summary>public void Stop(){SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);bStat = false; }
4、抓图
/// < summary>/// 抓图/// < /summary>/// < param name="path">要保存bmp文件的路径public void GrabImage(string path){ IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64());} /// < summary>/// 录像/// < /summary>/// < param name="path">要保存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);}/// < summary>/// 停止录像/// < /summary>public void StopKinescope(){SendMessage(hWndC, WM_CAP_STOP, 0, 0);}
完整代码
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Windows.Forms; using System.Runtime.InteropServices; using com.google.zxing.qrcode.decoder; using com.google.zxing.client; using com.google.zxing.common; using System.Threading;public partial class Decode : System.Web.UI.Page {// public delegate void SaveImg(Pick Pick1);/// < summary>/// 一个控制摄像头的类/// < /summary>public class Pick{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 bool bStat = false;private IntPtr mControlPtr;private int mWidth;private int mHeight;private int mLeft;private int mTop;/// < summary>/// 初始化摄像头/// < /summary>/// < param name="handle">控件的句柄/// < param name="left">开始显示的左边距/// < param name="top">开始显示的上边距/// < param name="width">要显示的宽度/// < param name="height">要显示的长度public Pick(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, int wParam, long lParam);/// < summary>/// 开始显示图像/// < /summary>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);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;}/// < summary> /// 停止显示 /// < /summary> public void Stop() {SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);bStat = false;}/// < summary>/// 抓图/// < /summary>/// < param name="path">要保存bmp文件的路径public void GrabImage(string path) {IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64());}/// < summary>/// 录像/// < /summary>/// < param name="path">要保存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);}/// < summary>/// 停止录像/// < /summary>public void StopKinescope() {SendMessage(hWndC, WM_CAP_STOP, 0, 0);}}protected void Page_Load(object sender, EventArgs e) {}//void DoInit()//{// System.Windows.Forms.Form frm = new Form();// frm.Height = 300;// frm.Width = 300;// System.Windows.Forms.PictureBox Panel = new System.Windows.Forms.PictureBox();// Panel.Height = 300;// Panel.Width = 300;// Panel.Visible = true;// Panel.BackgroundImageLayout = ImageLayout.None;// frm.Controls.Add(Panel);// frm.TopMost = true;// Pick p = new Pick(Panel.Handle, 0, 0, 300, 300);// p.Start();// frm.Show();// p.Kinescope(Server.MapPath("img\\Decode2.avi"));// p.GrabImage(Server.MapPath("img\\Decode1.bmp"));// p.Stop();// frm.Close();// frm.Dispose();//}private void getQrcode() {try{//ThreadStart worker = new ThreadStart(DoInit);//Thread th = new Thread(worker);//th.IsBackground = true;//th.Start();System.Windows.Forms.Form frm = new Form();frm.Height = 300;frm.Width = 300;System.Windows.Forms.PictureBox Panel = new System.Windows.Forms.PictureBox();Panel.Height = 300;Panel.Width = 300;Panel.Visible = true;Panel.BackgroundImageLayout = ImageLayout.None;frm.Controls.Add(Panel);frm.TopMost = true;Pick p = new Pick(Panel.Handle, 0, 0, 300, 300);p.Start();int i = 1;while (i <= 1){p.GrabImage(Server.MapPath("img\\Decode.bmp"));p.Kinescope(Server.MapPath("img\\Video.avi"));i++;}p.Stop();frm.Close();frm.Dispose();try{com.google.zxing.qrcode.QRCodeReader d = new com.google.zxing.qrcode.QRCodeReader();RGBLuminanceSource rg = new RGBLuminanceSource(new System.Drawing.Bitmap(Server.MapPath("img\\Decode.bmp")), new System.Drawing.Bitmap(Server.MapPath("img\\Decode.bmp")).Width, new System.Drawing.Bitmap(Server.MapPath("img\\Decode.bmp")).Height);com.google.zxing.LuminanceSource ls = rg;HybridBinarizer hb = new HybridBinarizer(ls);com.google.zxing.BinaryBitmap bm = new com.google.zxing.BinaryBitmap(hb);com.google.zxing.Result r = d.decode(bm);TextBox1.Text = r.Text;}catch (Exception ex){TextBox1.Text = "";//MessageBox.Show(ex.Message+"111");throw new Exception(ex.Message);}}catch (Exception ee){ee.ToString();}}protected void Timer1_Tick(object sender, EventArgs e) {//getQrcode();}protected void Button1_Click(object sender, EventArgs e) {getQrcode();}}
以上就是本文的全部内容,希望对大家的学习有所帮助。
简单介绍C#获取摄像头拍照显示图像的方法相关推荐
- C#获取摄像头拍照显示图像
概述 之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户. 其实本质就是保存图像二维码,在进行二维码识别. 下面来看看如何实现. 主要代码实现 ...
- html实验:百度API定位+获取摄像头拍照
html实验:百度API定位+获取摄像头拍照 本次实验,在chrome浏览器和edge浏览器下进行. 页面效果如下,刚进入浏览器的时候,会自动获取地理位置,并显示出来 同时,地理位置会出现在最右侧的百 ...
- Qt 中获取摄像头图像数据的方法
Qt 中获取摄像头图像数据的方法 在 Qt 中提供了 QCamera 类用来操作摄像头.(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机.)摄像头获取的实时图像可 ...
- Linux中通过v4l2框架获取摄像头的能力的方法
v4l2(video for linux two)是Linux中内核提供给应用层访问音视频驱动的统一接口.v4l2中获取摄像头的能力的是通过ioctl函数的VIDIOC_QUERYCAP命令获取,并且 ...
- 简单介绍vue获取token实现token登录的示例代码
最近新做了个vue项目,正好项目中有登录部分,本文就详细的介绍一下登录部分的实现,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下 使用token做登录验证的思路大致如下: 1.在第一次登 ...
- C语言中strand() rand() time()函数的简单介绍及获取随机数的方法
rand()函数简介 功 能 :伪随机数发生器 所属库:stdlib.h 用 法 :需要先调用srand初始化,一般用当前日历时间初始化随机数种子,这样每行代码都可以产生不同的随机数. 函数原型:in ...
- h5移动端实时获取摄像头拍照-可以通过上传图片进行人脸识别
IOS系统要11以上,且必须是https ```js 拍照 播放 ```
- 简单介绍订单号或者流水号的生成方法
一般订单号或者流水号等可能在一些平台会用到,然后我就简单的介绍一个我自己生成订单号和流水号的一个方法吧,如果程序有问题或者你有更好的生成办法,欢迎留言,留下你的文章链接,我们一起学习和进步哈. 方法简 ...
- java单元测试启动类配置_Springboot 单元测试简单介绍和启动所有测试类的方法
最近一段时间都是在补之前的技术债,一直忙着写业务代码没有注重代码的质量,leader也在强求,所有要把单元测试搞起来了 我把单元测试分为两种 一个是service的单元测试,一个是controller ...
最新文章
- [补] windows C socket编程——大物实验预约
- gradle 配置java 项目maven 依赖
- Linux:批量清空当前目录下的日志文件
- python udp 大文件_Python:通过UDP发送大对象
- 用函数计算工龄_用Excel计算财务账期,离不开这3个函数
- 特斯拉CEO马斯克又怼巴菲特:别把冰雪皇后给毁了
- c语言二进制加法_“整形数”还真没那么简单(C语言版)
- 剑指offer面试题06. 从尾到头打印链表(辅助栈法)
- Viliv N5 GPS安装及使用方法
- 「代码随想录」968.监控二叉树【贪心算法】力扣详解!
- java蘑菇岛种子_我的世界:Java版玩家笑开了怀,4个地图种子,2个内陆蘑菇岛...
- oracle卸载客户端,oracle11g客户端如何完全卸载
- 注册表:基本概念和reg文件
- UltraISO 软碟通制作 Windows 7 系统 U 盘启动盘
- python中array是什么意思_python array是什么
- STM32—LED单灯闪烁之软件延时
- html显示用户ipv6地址,IPv6地址查询
- js如何判断IE浏览器的版本包括IE11
- ofo频繁申请电单车专利,然而共享电单车市场却冰冰凉
- 技术一旦被用来作恶,究竟会有多可怕?