最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#獲取攝像頭拍照顯示圖像的方法

 更新時間:2022年03月27日 10:51:29   作者:dotNET跨平臺  
這篇文章主要為大家詳細(xì)介紹了C#獲取攝像頭拍照顯示圖像的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C#獲取攝像頭拍照顯示圖像的具體代碼,供大家參考,具體內(nèi)容如下

概述

之前有個需求,就是在web界面可以實現(xiàn)調(diào)用攝像頭,用戶把手機(jī)的個人二維碼展示給攝像頭,攝像頭進(jìn)行攝像識別用戶。

其實本質(zhì)就是保存圖像二維碼,在進(jìn)行二維碼識別。

下面來看看如何實現(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();
? ? }
?
?
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中out與ref作用區(qū)別示例分析

    C#中out與ref作用區(qū)別示例分析

    這篇文章主要為大家介紹了C#中out與ref作用區(qū)別示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 使用C#實現(xiàn)上位機(jī)與PLC通信的過程詳解

    使用C#實現(xiàn)上位機(jī)與PLC通信的過程詳解

    隨著工業(yè)自動化技術(shù)的不斷發(fā)展,PLC(可編程邏輯控制器)已成為現(xiàn)代生產(chǎn)過程中不可或缺的設(shè)備,為了實現(xiàn)設(shè)備之間的數(shù)據(jù)交換和遠(yuǎn)程控制,上位機(jī)系統(tǒng)需要與PLC進(jìn)行通信,在本文中,我們將從零開始,介紹如何使用C#實現(xiàn)上位機(jī)與PLC的通信,需要的朋友可以參考下
    2025-01-01
  • C#數(shù)組初始化簡析

    C#數(shù)組初始化簡析

    C#數(shù)組與其它C系列語言有著很多的不同,以前接觸的時候理解出現(xiàn)很大的偏差。尤其是對多維數(shù)組的認(rèn)識,本文將詳細(xì)介紹C#數(shù)組初始化,需要的朋友可以參考下
    2012-11-11
  • C# 委托中 Invoke/BeginInvoke/EndInvoke和DynamicInvoke 方法的區(qū)別和聯(lián)系

    C# 委托中 Invoke/BeginInvoke/EndInvoke和DynamicInvoke&

    在C#中,委托(Delegate)提供了多種調(diào)用方式,包括 Invoke、BeginInvoke、EndInvoke 和 DynamicInvoke,每種調(diào)用方式都有其特定的用途和適用場景,下面將詳細(xì)介紹這些方法的區(qū)別與聯(lián)系,感興趣的朋友一起看看吧
    2025-03-03
  • C#實現(xiàn)自定義FTP操作封裝類實例

    C#實現(xiàn)自定義FTP操作封裝類實例

    這篇文章主要介紹了C#實現(xiàn)自定義FTP操作封裝類,涉及C#操作FTP的連接、傳輸、下載等操作的實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C#編寫的windows計算器的實例代碼

    C#編寫的windows計算器的實例代碼

    這篇文章介紹了C#編寫windows計算器的代碼,有需要的朋友可以參考一下
    2013-07-07
  • 淺談關(guān)于C#的垃圾回收機(jī)制

    淺談關(guān)于C#的垃圾回收機(jī)制

    淺談關(guān)于C#的垃圾回收機(jī)制,需要的朋友可以參考一下
    2013-03-03
  • C#實現(xiàn)冒泡排序算法的代碼示例

    C#實現(xiàn)冒泡排序算法的代碼示例

    冒泡排序即是對數(shù)組每次輪循出最大數(shù)或最小數(shù)放在隊尾,這里我們來看一下C#實現(xiàn)冒泡排序算法的代碼示例,需要的朋友可以參考下
    2016-07-07
  • C#文件斷點續(xù)傳實現(xiàn)方法

    C#文件斷點續(xù)傳實現(xiàn)方法

    這篇文章主要介紹了C#文件斷點續(xù)傳實現(xiàn)方法,涉及C#文件傳輸?shù)募记?具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • Unity3d獲取系統(tǒng)時間

    Unity3d獲取系統(tǒng)時間

    本文通過一段代碼給大家詳解unity3d獲取系統(tǒng)時間,代碼簡單易懂,小伙伴們快來看看吧
    2015-11-11

最新評論

闽侯县| 塘沽区| 蕲春县| 许昌县| 凤山县| 柳州市| 河北区| 深水埗区| 灵石县| 宾川县| 合肥市| 绍兴市| 宁武县| 彭山县| 仙居县| 贵州省| 沅陵县| 元氏县| 潢川县| 琼海市| 长春市| 宝应县| 吴川市| 托里县| 贺州市| 玉门市| 宁津县| 特克斯县| 南郑县| 个旧市| 本溪| 长岭县| 沧州市| 千阳县| 遵化市| 富平县| 临城县| 寻甸| 高阳县| 莎车县| 华池县|