亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

本文實(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ù)做登錄判斷代碼實(shí)例

    這篇文章主要介紹了C#使用out參數(shù)做登錄判斷,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • unity3d調(diào)用手機(jī)或電腦攝像頭

    unity3d調(diào)用手機(jī)或電腦攝像頭

    這個(gè)是在網(wǎng)上看到的,經(jīng)測試可以在電腦上運(yùn)行,確實(shí)調(diào)用了本地?cái)z像頭。有需要的小伙伴可以參考下。
    2015-03-03
  • Unity實(shí)現(xiàn)顏色漸變滑動條

    Unity實(shí)現(xiàn)顏色漸變滑動條

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)顏色漸變滑動條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Unity 按鈕事件封裝操作(EventTriggerListener)

    Unity 按鈕事件封裝操作(EventTriggerListener)

    這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#讀取視頻的寬度和高度等信息的方法

    C#讀取視頻的寬度和高度等信息的方法

    這篇文章主要介紹了C#讀取視頻的寬度和高度等信息的方法,通過執(zhí)行一條CMD命令來實(shí)現(xiàn)讀取視頻寬度和高度的功能,具有不錯(cuò)的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-11-11
  • C#中常見的系統(tǒng)內(nèi)置委托用法詳解

    C#中常見的系統(tǒng)內(nèi)置委托用法詳解

    這篇文章主要介紹了C#中常見的系統(tǒng)內(nèi)置委托用法,主要包括了Action類的委托、Func類的委托、Predicate<T>委托、Comparison<T>委托等,需要的朋友可以參考下
    2014-09-09
  • C# 延遲Task.Delay()和Thread.Sleep()的具體使用

    C# 延遲Task.Delay()和Thread.Sleep()的具體使用

    Thread.Sleep()是同步延遲,Task.Delay()是異步延遲,本文主要介紹了C# 延遲Task.Delay()和Thread.Sleep()的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 在GridControl控件上綁定圖片的幾種操作方式詳解

    在GridControl控件上綁定圖片的幾種操作方式詳解

    GridControl控件是經(jīng)常用來綁定數(shù)據(jù)的,一般以常規(guī)的字符內(nèi)容為主,有時(shí)候也會有圖片的顯示需要,這篇文章主要介紹了在GridControl控件上綁定圖片的幾種操作方式詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • C#?Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間

    C#?Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間

    這篇文章主要為大家詳細(xì)介紹了C#如何使用Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • C#中struct與class的區(qū)別詳解

    C#中struct與class的區(qū)別詳解

    本文主要介紹了C#中struct與class的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論