91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用winform怎么調用攝像頭掃碼識別二維碼

發布時間:2021-02-18 14:10:19 來源:億速云 閱讀:336 作者:Leah 欄目:開發技術

本篇文章為大家展示了利用winform怎么調用攝像頭掃碼識別二維碼,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

創建一個空的winform項目解決方案

將Form1作為主窗體,設置相關屬性:

  StartPosition:CenterScreen (窗體居中)

  添加一個居中標題:

private void LoadTitleCenterData()
 {
      string titleMsg ="二維碼識別主界面";
      Graphics g = this.CreateGraphics();
      Double startingPoint = (this.Width / 2) - (g.MeasureString(titleMsg, this.Font).Width / 2);
      Double widthOfASpace = g.MeasureString(" ", this.Font).Width;
      String tmp = " ";
      Double tmpWidth = 0;

      while ((tmpWidth + widthOfASpace) < startingPoint)
      {
        tmp += " ";
        tmpWidth += widthOfASpace;
      }
      this.Text = tmp + titleMsg;
 }

最大最小化禁用:

public Form1()
{
  this.MinimizeBox = false;
  this.MaximizeBox = false;
  InitializeComponent();
  LoadTitleCenterData();
}

Form1中添加一個TableLayoutPanel,三行三列,比例按照百分比:10%,80%,10%這樣

在TableLayoutPanel的80%中再添加一個TableLayoutPanel,還是行比例:20%,80%這樣(二八定律)

在TableLayoutPanel中添加Panel,在其中手動在添加幾個按鈕和label

最終界面這樣(能看就行):

利用winform怎么調用攝像頭掃碼識別二維碼

添加一個二維碼識別界面CameraQR:

使用Nuget添加引用,搜索AForge,將如下程序包引入:

利用winform怎么調用攝像頭掃碼識別二維碼

添加一個識別二維碼的窗體,命名名稱為:CameraQR

將VideoSourcePlayer添加到窗體中,Fill顯示:

利用winform怎么調用攝像頭掃碼識別二維碼

窗體中定義幾個私有變量:

 private AForge.Video.DirectShow.FilterInfoCollection _videoDevices;//攝像設備
 System.Timers.Timer timer;//定時器
 CameraHelper _cameraHelper = new CameraHelper();//視屏設備操作類

窗體Load事件中獲取拍照設備列表,并將第一個設備作為攝像設備(如有前后兩個或多個攝像頭,自己去改一下代碼,設置成可以選擇的,在CameraHelper中的CreateFilterInfoCollection()中):

private void CameraQR_Load(object sender, EventArgs e)
{
      // 獲取視頻輸入設備
      _videoDevices = _cameraHelper.CreateFilterInfoCollection();//獲取拍照設備列表
      if (_videoDevices.Count == 0)
      {
        MessageBox.Show("無設備");
        this.Dispose();
        this.Close();
        return;
      }
      resultStr = "";//二維碼識別字符串清空
      _cameraHelper.ConnectDevice(videoSourcePlayer1);//連接打開設備
}

組件初始化完成之后,添加一個定時任務,用來階段性識別攝像設備中的圖片資源,我寫的是每200毫秒去識別一次,如果圖片中有二維碼,就識別二維碼;識別成功之后,關閉窗體,將識別結果返回給上一個界面,此處需要一個有識別二維碼程序包

使用Nuget添加引用,搜索ZXing,將如下程序包引入:

利用winform怎么調用攝像頭掃碼識別二維碼

 代碼如下(核心代碼基本就這些):

public CameraQR()
{
  this.MinimizeBox = false;
  this.MaximizeBox = false;
  InitializeComponent();
  LoadTitleCenterData();
  CheckForIllegalCrossThreadCalls = false;//多線程中訪問窗體控件資源不會異常
  AddTimer();//定時識別圖片
}

private void AddTimer()
{
 timer = new System.Timers.Timer();
 timer.Enabled = true;
 timer.Interval = 200;
 timer.Start();
 timer.Elapsed += new ElapsedEventHandler(PicToQRCode);
}
private void PicToQRCode(object sender, ElapsedEventArgs e)
{
      if (_cameraHelper.img == null)
        return;
      BinaryBitmap bitmap = null;
      try
      {
        MemoryStream ms = new MemoryStream();
        _cameraHelper.img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        byte[] bt = ms.GetBuffer();
        ms.Close();
        LuminanceSource source = new RGBLuminanceSource(bt, _cameraHelper.img.Width, _cameraHelper.img.Height);
        bitmap = new BinaryBitmap(new ZXing.Common.HybridBinarizer(source));
      }
      catch (Exception ex)
      {
        return;
      }

      Result result=null;
      try
      {
        //開始解碼
        result = new MultiFormatReader().decode(bitmap);
      }
      catch (ReaderException ex)
      {
        resultStr = ex.ToString();
      }
      if (result != null)
      {
        resultStr = result.Text;
        this.DialogResult = DialogResult.OK;
        this.Close();
      }}

窗體關閉時,記得釋放定時器 關閉攝像頭(不然異常滿天飛):

private void CameraQR_FormClosing(object sender, FormClosingEventArgs e)
{
   if (timer != null)
   {
     timer.Dispose();
   }
    _cameraHelper.CloseDevice();
 }

CameraHelper類:

public class CameraHelper
{
  public FilterInfoCollection _videoDevices;//本機攝像硬件設備列表
  public VideoSourcePlayer _videoSourcePlayer;//視頻畫布
  public Bitmap img = null;//全局變量,保存每一次捕獲的圖像
  public System.Drawing.Image CaptureImage(VideoSourcePlayer sourcePlayer = null)
  {

    if (sourcePlayer == null || sourcePlayer.VideoSource == null)
    {
      if (_videoSourcePlayer == null)
        return null;
      else
      {
        sourcePlayer = _videoSourcePlayer;
      }
    }

    try
    {
      if (sourcePlayer.IsRunning)
      {
        System.Drawing.Image bitmap = sourcePlayer.GetCurrentVideoFrame();
        return bitmap;
      }
      return null;

    }
    catch (Exception ex)
    {
      return null;
    }
  }

  public FilterInfoCollection CreateFilterInfoCollection()
  {
    if (_videoDevices != null)
      return _videoDevices;
    _videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    return _videoDevices;
  }

  public VideoCaptureDevice ConnectDevice(VideoSourcePlayer videoSourcePlayer, FilterInfo filterInfo = null)
  {
    VideoCaptureDevice videoSource = new VideoCaptureDevice();
    if (filterInfo == null)
    {
      videoSource = new VideoCaptureDevice(_videoDevices[_videoDevices.Count - 1].MonikerString);
    }
    else
    {
      videoSource = new VideoCaptureDevice(filterInfo.MonikerString);
    }

    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
    videoSourcePlayer.VideoSource = videoSource;
    videoSourcePlayer.Start();
    _videoSourcePlayer = videoSourcePlayer;
    return videoSource;
  }

  private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
  {
    img = (Bitmap)eventArgs.Frame.Clone();
  }

  public void CloseDevice(VideoSourcePlayer videoSourcePlayer = null)
  {
    if (videoSourcePlayer == null)
    {
      if (_videoSourcePlayer == null)
        return;
      _videoSourcePlayer.SignalToStop();
    }
    else
    {
      videoSourcePlayer.SignalToStop();
    }
  }
}

上述內容就是利用winform怎么調用攝像頭掃碼識別二維碼,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

博客| 德钦县| 云霄县| 广西| 新闻| 天全县| 松滋市| 房山区| 南郑县| 泗水县| 桦甸市| 惠州市| 静海县| 栾川县| 贡觉县| 靖江市| 自治县| 广昌县| 三亚市| 沽源县| 苍南县| 建瓯市| 胶南市| 漳浦县| 遂川县| 贵溪市| 五大连池市| 安丘市| 偃师市| 泗水县| 平遥县| 开阳县| 江门市| 凤阳县| 南和县| 普安县| 岢岚县| 平顶山市| 静安区| 从江县| 五大连池市|