網(wǎng)站首頁 編程語言 正文
本文實例為大家分享了C#獲取攝像頭拍照顯示圖像的具體代碼,供大家參考,具體內(nèi)容如下
概述
之前有個需求,就是在web界面可以實現(xiàn)調(diào)用攝像頭,用戶把手機的個人二維碼展示給攝像頭,攝像頭進行攝像識別用戶。
其實本質(zhì)就是保存圖像二維碼,在進行二維碼識別。
下面來看看如何實現(xiàn)。
主要代碼實現(xiàn)
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(); ? ? } ? ? }
原文鏈接:https://blog.csdn.net/sD7O95O/article/details/117608132
相關(guān)推薦
- 2022-06-24 Python抽象類應(yīng)用詳情_python
- 2022-10-02 iOS實現(xiàn)可拖動的浮動菜單_IOS
- 2022-08-30 C語言例題講解指針與數(shù)組_C 語言
- 2022-04-10 cmd無法加載命令解決方法
- 2022-06-10 C語言?模擬實現(xiàn)strlen函數(shù)詳解_C 語言
- 2022-12-02 C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)_C 語言
- 2022-05-03 基于Python制作一款屏幕顏色提取器_python
- 2024-03-08 jdk版本不兼容 Error creating bean with name ‘springSecu
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支