簡單介紹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(); } }
以上就是本文的全部內容,希望對大家的學習有所幫助。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2886320/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡單介紹C#呼叫USB攝像頭的方法C#
- Android呼叫攝像頭拍照並顯示照片Android
- C#實現攝像頭呼叫、拍照C#
- 在Android中呼叫攝像頭拍照並顯示出來Android
- 安卓呼叫攝像頭拍照安卓
- Android提供的攝像頭拍照Android
- C# 使用AForge呼叫筆記本攝像頭拍照C#筆記
- Android呼叫攝像頭拍照Android
- Android 呼叫攝像頭拍照Android
- Nebulosity 4 for Mac(攝像頭影像捕獲工具)Mac
- 解決win7攝像頭影像倒立的方法Win7
- Unity 3d UI獲取外部攝像頭拍攝Unity3DUI
- Android中呼叫攝像頭拍照儲存,並在相簿中選擇圖片顯示Android
- 《OpenCV設定和獲取攝像頭引數》OpenCV
- 照片系列之android呼叫攝像頭拍照Android
- Android開發之呼叫攝像頭拍照Android
- html5呼叫攝像頭實現拍照HTML
- 簡單介紹四種Python 列表反轉顯示的方法Python
- WebRTC從攝像頭獲取圖片傳入canvasWebCanvas
- 瀏覽器呼叫攝像頭進行拍照程式瀏覽器
- Android 呼叫攝像頭功能【拍照與視訊】Android
- AngularJS中使用HTML5攝像頭拍照AngularJSHTML
- android studio之簡單呼叫攝像頭並且獲取其照片Android
- 原生javascript獲取dom元素簡單介紹JavaScript
- js獲取元素的樣式值簡單介紹JS
- 【Android】【opencv】實現攝像頭拍照和錄影AndroidOpenCV
- jquery獲取json資料簡單介紹jQueryJSON
- js獲取地理位置資訊簡單介紹JS
- iPhone XS/iPhone XS Max攝像頭拍照解析:蘋果也玩起了AI拍照iPhone蘋果AI
- 攝像頭黑屏怎麼辦 各種攝像頭不能用的解決方法
- Python基於opencv呼叫攝像頭獲取個人圖片PythonOpenCV
- FFmpeg讀取Mac攝像頭的問題Mac
- 純JavaScript實現的呼叫裝置攝像頭並拍照的功能JavaScript
- web呼叫攝像頭拍照並上傳到伺服器Web伺服器
- Caffeine快取的簡單介紹快取
- Win10怎麼開啟攝像頭 win10開啟攝像頭的方法Win10
- javascript獲取數字中最大的一個簡單介紹JavaScript
- jquery實現的倒數獲取li元素簡單介紹jQuery