C#怎么获取摄像头拍照显示图像
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,本篇内容主要讲解"C#怎么获取摄像头拍照显示图像",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#怎么获取摄像头拍照显示图像"吧!概述之前有个需求,就是在
千家信息网最后更新 2025年02月03日C#怎么获取摄像头拍照显示图像
本篇内容主要讲解"C#怎么获取摄像头拍照显示图像",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#怎么获取摄像头拍照显示图像"吧!
概述
之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户。
其实本质就是保存图像二维码,在进行二维码识别。
下面来看看如何实现。
主要代码实现
1、初始化摄像头
////// 初始化摄像头 /// /// 控件的句柄 /// 开始显示的左边距 /// 开始显示的上边距 /// 要显示的宽度 /// 要显示的长度 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、开始显示图像
////// 开始显示图像 /// 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、停止显示
////// 停止显示 /// public void Stop() { SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); bStat = false;}
4、抓图
////// 抓图 /// /// 要保存bmp文件的路径 public void GrabImage(string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64()); } ////// 录像 /// /// 要保存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); }
完整代码
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); ////// 一个控制摄像头的类 /// 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; ////// 初始化摄像头 /// /// 控件的句柄 /// 开始显示的左边距 /// 开始显示的上边距 /// 要显示的宽度 /// 要显示的长度 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); ////// 开始显示图像 /// 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; } ////// 停止显示/// public void Stop(){ SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); bStat = false; } ////// 抓图 /// /// 要保存bmp文件的路径 public void GrabImage(string path){ IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64()); } ////// 录像 /// /// 要保存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); } } 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#
二维
二维码
上边
代码
内容
句柄
宽度
就是
控件
用户
长度
学习
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
将空格存入数据库时
网络安全防护主体责任
机车数据库
北京金昌数据库
软件开发step是什么
网络安全课件ppt免费
把一串数据库取整的函数
服务器2u机架式
广州安卓软件开发机构
入职互联网还是科技公司好
数据库投影会不会消除重复
锐思金融数据库
对象中集合添加到数据库
json 存数据库
信阳民宿软件开发
关于软件开发的法规
sa服务器指的是
服务器的介绍
mysql主从数据库部署
网站服务器安全维护的作用
丽水制造软件开发工程师
曙光视频分析服务器
工业控制网络技术及应用
海康配套算法服务器价格
gen8 服务器
服务器台式机属于什么行业
湖南大学网络安全实验室
广州未来集市网络技术
服务器防护柜怎么开启
大学法制主题体验馆软件开发