C#獲取攝像頭拍照顯示圖像的方法
本文實(shí)例為大家分享了C#獲取攝像頭拍照顯示圖像的具體代碼,供大家參考,具體內(nèi)容如下
概述
之前有個(gè)需求,就是在web界面可以實(shí)現(xiàn)調(diào)用攝像頭,用戶把手機(jī)的個(gè)人二維碼展示給攝像頭,攝像頭進(jìn)行攝像識別用戶。
其實(shí)本質(zhì)就是保存圖像二維碼,在進(jìn)行二維碼識別。
下面來看看如何實(shí)現(xiàn)。
主要代碼實(shí)現(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> ? ? /// 一個(gè)控制攝像頭的類 ? ? /// </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(); ? ? } ? ? }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C#方法中使用out參數(shù)做登錄判斷代碼實(shí)例
這篇文章主要介紹了C#使用out參數(shù)做登錄判斷,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Unity 按鈕事件封裝操作(EventTriggerListener)
這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04C# 延遲Task.Delay()和Thread.Sleep()的具體使用
Thread.Sleep()是同步延遲,Task.Delay()是異步延遲,本文主要介紹了C# 延遲Task.Delay()和Thread.Sleep()的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01C#?Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間
這篇文章主要為大家詳細(xì)介紹了C#如何使用Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03