QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 3149|回复: 0

[C#/.NET] C#获取摄像头拍照显示图像

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1295 小时
   最后登录 : 2024-11-23

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-11-25 11:47:17 | 显示全部楼层 |阅读模式
一、概述# @/ O/ F% q$ X9 [6 X1 ]; r0 [
       之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户。其实本质就是保存图像二维码,在进行二维码识别。下面来看看如何实现。
: s, V5 @# U- T7 ^, I二、主要代码实现' S; f8 _- m, y2 J& ^
1、初始化摄像头- J5 h1 W# _; `& X2 w$ e- C
  1. /// <summary>
  2.         /// 初始化摄像头
  3.         /// </summary>
  4.         /// <param name="handle">控件的句柄</param>
  5.         /// <param name="left">开始显示的左边距</param>
  6.         /// <param name="top">开始显示的上边距</param>
  7.         /// <param name="width">要显示的宽度</param>
  8.         /// <param name="height">要显示的长度</param>
  9.         public Pick(IntPtr handle, int left, int top, int width, int height)
  10.         {
  11.             mControlPtr = handle;
  12.             mWidth = width;
  13.             mHeight = height;
  14.             mLeft = left;
  15.             mTop = top;
  16.         }
  17.         [DllImport("avicap32.dll")]
  18.         private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
  19.         [DllImport("avicap32.dll")]
  20.         private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
  21.         [DllImport("User32.dll")]
  22.         private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, long lParam);
2、开始显示图像  i* q" P& i9 `6 e
  1.   /// <summary>
  2.         /// 开始显示图像
  3.         /// </summary>
  4.         public void Start()
  5.         {
  6.             if (bStat)
  7.                 return;
  8.             bStat = true;
  9.             byte[] lpszName = new byte[100];
  10.             hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);
  11.             if (hWndC.ToInt32() != 0)
  12.             {
  13.                 SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
  14.                 SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
  15.                 SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
  16.                 SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
  17.                 SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
  18.                 SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
  19.                 SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
  20.                 SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
  21.             }
  22.             return;
  23.         }
3、停止显示( s1 O' R! v6 o% j# n5 o
  1.   /// <summary>
  2.         /// 停止显示
  3.         /// </summary>
  4.         public void Stop()
  5.         {
  6.             SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
  7.             bStat = false;
  8.         }
4、抓图
3 k+ E8 m+ h# l( M/ T: m2 ]: b
  1. /// <summary>
  2.         /// 抓图
  3.         /// </summary>
  4.         /// <param name="path">要保存bmp文件的路径</param>
  5.         public void GrabImage(string path)
  6.         {
  7.             IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
  8.             SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64());
  9.         }
  10.         /// <summary>
  11.         /// 录像
  12.         /// </summary>
  13.         /// <param name="path">要保存avi文件的路径</param>
  14.         public void Kinescope(string path)
  15.         {
  16.             IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
  17.             SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
  18.             SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
  19.         }
  20.         /// <summary>
  21.         /// 停止录像
  22.         /// </summary>
  23.         public void StopKinescope()
  24.         {
  25.             SendMessage(hWndC, WM_CAP_STOP, 0, 0);
  26.         }
三、完整代码
6 ?8 y3 h$ r0 V% y, i
  1. using System;
  2. using System.Collections;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Web;
  7. using System.Web.Security;
  8. using System.Web.UI;
  9. using System.Web.UI.HtmlControls;
  10. using System.Web.UI.WebControls;
  11. using System.Web.UI.WebControls.WebParts;
  12. using System.Xml.Linq;
  13. using System.Windows.Forms;
  14. using System.Runtime.InteropServices;
  15. using com.google.zxing.qrcode.decoder;
  16. using com.google.zxing.client;
  17. using com.google.zxing.common;
  18. using System.Threading;
  19. public partial class Decode : System.Web.UI.Page
  20. {
  21.    // public delegate void SaveImg(Pick Pick1);
  22.     /// <summary>
  23.     /// 一个控制摄像头的类
  24.     /// </summary>
  25.     public class Pick
  26.     {
  27.         private const int WM_USER = 0x400;
  28.         private const int WS_CHILD = 0x40000000;
  29.         private const int WS_VISIBLE = 0x10000000;
  30.         private const int WM_CAP_START = WM_USER;
  31.         private const int WM_CAP_STOP = WM_CAP_START + 68;
  32.         private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
  33.         private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
  34.         private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
  35.         private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
  36.         private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
  37.         private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
  38.         private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
  39.         private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
  40.         private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
  41.         private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
  42.         private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
  43.         private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
  44.         private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
  45.         private const int WM_CAP_SET_SCALE = WM_CAP_START + 53;
  46.         private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
  47.         private IntPtr hWndC;
  48.         private bool bStat = false;
  49.         private IntPtr mControlPtr;
  50.         private int mWidth;
  51.         private int mHeight;
  52.         private int mLeft;
  53.         private int mTop;
  54.    
  55.         /// <summary>
  56.         /// 初始化摄像头
  57.         /// </summary>
  58.         /// <param name="handle">控件的句柄</param>
  59.         /// <param name="left">开始显示的左边距</param>
  60.         /// <param name="top">开始显示的上边距</param>
  61.         /// <param name="width">要显示的宽度</param>
  62.         /// <param name="height">要显示的长度</param>
  63.         public Pick(IntPtr handle, int left, int top, int width, int height)
  64. {
  65.             mControlPtr = handle;
  66.             mWidth = width;
  67.             mHeight = height;
  68.             mLeft = left;
  69.             mTop = top;
  70.         }
  71.         [DllImport("avicap32.dll")]
  72.         private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
  73.         [DllImport("avicap32.dll")]
  74.         private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
  75.         [DllImport("User32.dll")]
  76.         private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, long lParam);
  77.         /// <summary>
  78.         /// 开始显示图像
  79.         /// </summary>
  80.         public void Start()
  81. {
  82.             if (bStat)
  83.                 return;
  84.             bStat = true;
  85.             byte[] lpszName = new byte[100];
  86.             hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);
  87.             if (hWndC.ToInt32() != 0)
  88.             {
  89.                 SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
  90.                 SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
  91.                 SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
  92.                 SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
  93.                 SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
  94.                 SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
  95.                 SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
  96.                 SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
  97.             }
  98.             return;
  99.         }
  100.         /// <summary>
  101.         /// 停止显示
  102.         /// </summary>
  103.         public void Stop()
  104. {
  105.             SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
  106.             bStat = false;
  107.         }
  108.         /// <summary>
  109.         /// 抓图
  110.         /// </summary>
  111.         /// <param name="path">要保存bmp文件的路径</param>
  112.         public void GrabImage(string path)
  113. {
  114.             IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
  115.             SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64());
  116.         }
  117.         /// <summary>
  118.         /// 录像
  119.         /// </summary>
  120.         /// <param name="path">要保存avi文件的路径</param>
  121.         public void Kinescope(string path)
  122. {
  123.             IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
  124.             SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
  125.             SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
  126.         }
  127.         /// <summary>
  128.         /// 停止录像
  129.         /// </summary>
  130.         public void StopKinescope()
  131. {
  132.             SendMessage(hWndC, WM_CAP_STOP, 0, 0);
  133.         }
  134.     }
  135.     protected void Page_Load(object sender, EventArgs e)
  136. {
  137.       
  138.     }
  139.     //void DoInit()
  140.     //{
  141.     //    System.Windows.Forms.Form frm = new Form();
  142.     //    frm.Height = 300;
  143.     //    frm.Width = 300;
  144.     //    System.Windows.Forms.PictureBox Panel = new System.Windows.Forms.PictureBox();
  145.     //    Panel.Height = 300;
  146.     //    Panel.Width = 300;
  147.     //    Panel.Visible = true;
  148.     //    Panel.BackgroundImageLayout = ImageLayout.None;
  149.     //    frm.Controls.Add(Panel);
  150.     //    frm.TopMost = true;
  151.     //    Pick p = new Pick(Panel.Handle, 0, 0, 300, 300);
  152.     //    p.Start();
  153.     //    frm.Show();
  154.     //    p.Kinescope(Server.MapPath("img\\Decode2.avi"));
  155.     //    p.GrabImage(Server.MapPath("img\\Decode1.bmp"));
  156.     //    p.Stop();
  157.     //    frm.Close();
  158.     //    frm.Dispose();
  159.     //}
  160.   
  161.     private void getQrcode()
  162. {
  163.         try
  164.         {
  165.            
  166.             //ThreadStart worker = new ThreadStart(DoInit);
  167.             //Thread th = new Thread(worker);
  168.             //th.IsBackground = true;
  169.             //th.Start();
  170.             System.Windows.Forms.Form frm = new Form();
  171.             frm.Height = 300;
  172.             frm.Width = 300;
  173.             System.Windows.Forms.PictureBox Panel = new System.Windows.Forms.PictureBox();
  174.             Panel.Height = 300;
  175.             Panel.Width = 300;
  176.             Panel.Visible = true;
  177.             Panel.BackgroundImageLayout = ImageLayout.None;
  178.             frm.Controls.Add(Panel);
  179.             frm.TopMost = true;
  180.             Pick p = new Pick(Panel.Handle, 0, 0, 300, 300);
  181.             p.Start();
  182.             int i = 1;
  183.             while (i <= 1)
  184.             {
  185.                 p.GrabImage(Server.MapPath("img\\Decode.bmp"));
  186.                 p.Kinescope(Server.MapPath("img\\Video.avi"));
  187.                 i++;
  188.             }
  189.             p.Stop();
  190.             frm.Close();
  191.             frm.Dispose();
  192.             try
  193.             {
  194.                 com.google.zxing.qrcode.QRCodeReader d = new com.google.zxing.qrcode.QRCodeReader();
  195.                 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);
  196.                 com.google.zxing.LuminanceSource ls = rg;
  197.                 HybridBinarizer hb = new HybridBinarizer(ls);
  198.                 com.google.zxing.BinaryBitmap bm = new com.google.zxing.BinaryBitmap(hb);
  199.                 com.google.zxing.Result r = d.decode(bm);
  200.                 TextBox1.Text = r.Text;
  201.      
  202.             }
  203.             catch (Exception ex)
  204.             {
  205.                 TextBox1.Text = "";
  206.                 //MessageBox.Show(ex.Message+"111");
  207.                 throw new Exception(ex.Message);
  208.             }
  209.       
  210.         }
  211.         catch (Exception ee)
  212.         {
  213.             ee.ToString();
  214.         }
  215.     }
  216.     protected void Timer1_Tick(object sender, EventArgs e)
  217. {
  218.         //getQrcode();
  219.     }
  220.     protected void Button1_Click(object sender, EventArgs e)
  221. {
  222.         getQrcode();
  223.     }
  224. }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-24 08:13

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表