这篇文章主要为大家详细介绍了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#获取摄像头拍照显示图像的方法相关推荐

  1. C#获取摄像头拍照显示图像

    概述 之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户. 其实本质就是保存图像二维码,在进行二维码识别. 下面来看看如何实现. 主要代码实现 ...

  2. html实验:百度API定位+获取摄像头拍照

    html实验:百度API定位+获取摄像头拍照 本次实验,在chrome浏览器和edge浏览器下进行. 页面效果如下,刚进入浏览器的时候,会自动获取地理位置,并显示出来 同时,地理位置会出现在最右侧的百 ...

  3. Qt 中获取摄像头图像数据的方法

    Qt 中获取摄像头图像数据的方法 在 Qt 中提供了 QCamera 类用来操作摄像头.(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机.)摄像头获取的实时图像可 ...

  4. Linux中通过v4l2框架获取摄像头的能力的方法

    v4l2(video for linux two)是Linux中内核提供给应用层访问音视频驱动的统一接口.v4l2中获取摄像头的能力的是通过ioctl函数的VIDIOC_QUERYCAP命令获取,并且 ...

  5. 简单介绍vue获取token实现token登录的示例代码

    最近新做了个vue项目,正好项目中有登录部分,本文就详细的介绍一下登录部分的实现,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下 使用token做登录验证的思路大致如下: 1.在第一次登 ...

  6. C语言中strand() rand() time()函数的简单介绍及获取随机数的方法

    rand()函数简介 功 能 :伪随机数发生器 所属库:stdlib.h 用 法 :需要先调用srand初始化,一般用当前日历时间初始化随机数种子,这样每行代码都可以产生不同的随机数. 函数原型:in ...

  7. h5移动端实时获取摄像头拍照-可以通过上传图片进行人脸识别

    IOS系统要11以上,且必须是https ```js 拍照 播放 ```

  8. 简单介绍订单号或者流水号的生成方法

    一般订单号或者流水号等可能在一些平台会用到,然后我就简单的介绍一个我自己生成订单号和流水号的一个方法吧,如果程序有问题或者你有更好的生成办法,欢迎留言,留下你的文章链接,我们一起学习和进步哈. 方法简 ...

  9. java单元测试启动类配置_Springboot 单元测试简单介绍和启动所有测试类的方法

    最近一段时间都是在补之前的技术债,一直忙着写业务代码没有注重代码的质量,leader也在强求,所有要把单元测试搞起来了 我把单元测试分为两种 一个是service的单元测试,一个是controller ...

最新文章

  1. [补] windows C socket编程——大物实验预约
  2. gradle 配置java 项目maven 依赖
  3. Linux:批量清空当前目录下的日志文件
  4. python udp 大文件_Python:通过UDP发送大对象
  5. 用函数计算工龄_用Excel计算财务账期,离不开这3个函数
  6. 特斯拉CEO马斯克又怼巴菲特:别把冰雪皇后给毁了
  7. c语言二进制加法_“整形数”还真没那么简单(C语言版)
  8. 剑指offer面试题06. 从尾到头打印链表(辅助栈法)
  9. Viliv N5 GPS安装及使用方法
  10. 「代码随想录」968.监控二叉树【贪心算法】力扣详解!
  11. java蘑菇岛种子_我的世界:Java版玩家笑开了怀,4个地图种子,2个内陆蘑菇岛...
  12. oracle卸载客户端,oracle11g客户端如何完全卸载
  13. 注册表:基本概念和reg文件
  14. UltraISO 软碟通制作 Windows 7 系统 U 盘启动盘
  15. python中array是什么意思_python array是什么
  16. STM32—LED单灯闪烁之软件延时
  17. html显示用户ipv6地址,IPv6地址查询
  18. js如何判断IE浏览器的版本包括IE11
  19. ofo频繁申请电单车专利,然而共享电单车市场却冰冰凉
  20. 技术一旦被用来作恶,究竟会有多可怕?

热门文章

  1. linux蓝牙适配器--驱动安装
  2. 一文读懂自动脱帽离心机
  3. 攻防世界 Crypto 不仅仅是Morse
  4. 女程序员向同事发200多条信息表白, 对方一条信息没回, 精神失常
  5. eclipse java vm_eclipse配置java虚拟机的方法 转
  6. DAG中复制队列长度和重播队列长度
  7. MAC本遭遇ARP攻击的处理办法
  8. 笔记本开机只有电池灯亮还可以听见工作声音就是屏幕也没有反应是怎么回事
  9. flutter聊天界面-自定义表情键盘实现
  10. 网络安全相关职业道德