日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

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

作者:dotNET跨平臺 ? 更新時間: 2022-05-29 編程語言

本文實例為大家分享了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

欄目分類
最近更新