概述

之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户。

其实本质就是保存图像二维码,在进行二维码识别。

下面来看看如何实现。

主要代码实现

1、初始化摄像头

  /// <summary>/// 初始化摄像头/// </summary>/// <param name="handle">控件的句柄</param>/// <param name="left">开始显示的左边距</param>/// <param name="top">开始显示的上边距</param>/// <param name="width">要显示的宽度</param>/// <param name="height">要显示的长度</param>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文件的路径</param>public void GrabImage(string path){IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64());}/// <summary>/// 录像/// </summary>/// <param name="path">要保存avi文件的路径</param>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>/// <param name="left">开始显示的左边距</param>/// <param name="top">开始显示的上边距</param>/// <param name="width">要显示的宽度</param>/// <param name="height">要显示的长度</param>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文件的路径</param>public void GrabImage(string path)
{IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64());}/// <summary>/// 录像/// </summary>/// <param name="path">要保存avi文件的路径</param>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#获取摄像头拍照显示图像的方法

    这篇文章主要为大家详细介绍了C#获取摄像头拍照显示图像的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了C#获取摄像头拍照显示图像的具体代码,供 ...

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

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

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

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

  4. pc 和手机调用摄像头拍照 获取照片 好用

    前端何如在代码中使用摄像头拍照功能 demo 部署服务器可以测试 <!DOCTYPE html> <html lang="en"><head>& ...

  5. HTML5获取手机摄像头拍照

    HTML5获取摄像头进行拍照,存储 徐涛 2017-1-3 <!DOCTYPE html> <html> <head><meta charset=" ...

  6. uniapp webview 直接调用原生摄像头拍照 拍视频 img video,通过ajax获取blob(file为特殊的blob)对象并上传到后端服务器

    web-view中通过plus方法调用摄像头拍照或者拍视频并上传后端的操作步骤如下 plus.camera.getCamera()获取摄像头对象 cmr cmr.captureImage(callba ...

  7. js获取摄像头权限实现拍照功能

    首先说一下js打开摄像头的流程: 使用getUserMedia打开摄像头然后将获取到的流媒体转成url放在video标签中的src中: 使用canvas的drawImage方法将video的内容绘至c ...

  8. java 使用onvif协议 PTZ 登录认证,获取摄像头位置, 控制摄像头转动,digest认证,拍照截图

    1. 介绍 前面公司做摄像头相关的项目,一开始使用的海康威视提供的相关接口来控制摄像头转动,获取位置等,后面发现由于大华的很多摄像头使用该接口却行不通,后面所以就转用通用的 onvif 协议来做相关的 ...

  9. AngularJS中使用HTML5摄像头拍照

    1. 项目背景 公司开发一个网站,在做用户头像修改的时候领导提到增加一个由摄像头拍照实现修改头像的功能.因为我们网站是基于Html5进行开发,所以就直接采用H5来实现拍照.起初觉得这个功能很简单,但是 ...

最新文章

  1. 收藏 | 图像分割深度学习从零开始学习路线
  2. 马尔科夫、最大熵、条件随机场
  3. oracle中noguarantee,关于undo guarantee
  4. JAVA实现一个图片上传预览功能
  5. 长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?
  6. DCB(串口的DCB结构)
  7. 如何下载python安装包的所有依赖_如何将包含所有依赖项的python包安装到Docker镜像中?...
  8. python中input函数的返回是哪种类型_Python3.x中input的变化:input函数默认返回字符串类型...
  9. 如何修改mysql物理文件存放地址_如何防封号物理地址和网络地址修改攻略
  10. php替换图片_php实现图片上传并进行替换操作
  11. 最新mysql数据库源码编译安装。
  12. 基于Python的周立功CAN上位机(详细教程)
  13. 服务器装win10 稳定吗,重装win10选32位还是64位?原来这么大区别,难怪感觉电脑不好使!...
  14. 怎么使用播放麦克风输入的音频呢
  15. python模拟12306购票_西甲彩经:巴塞罗那取连胜,塞维利亚不败
  16. silverlight | chrion.exe-动态语言创建silverlight
  17. Adobe产品adobe ID登录卡死问题的解决
  18. HDOJ 1495 倒可乐(BFS)
  19. unity3d 摄像机跟随角色时被物体遮挡解决方案
  20. HTML5 六 MathML

热门文章

  1. 什么时候使用路由再分配?
  2. PHP 利用Mail_MimeDecode类提取邮件信息
  3. Java web application——基础
  4. [Linux环境]-centos7下安装jdk1.8.0_141流程.
  5. python-list:列表-元组-字符串
  6. platform_set_drvdata和platform_get_drvdata用法【转】
  7. 看出每个应用程序最高可用内存是多少
  8. 关于jstl.jar引用问题及解决方法
  9. mediawiki 搭建
  10. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)