服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - winform 调用摄像头扫码识别二维码的实现步骤

winform 调用摄像头扫码识别二维码的实现步骤

2022-11-01 14:49随风去远方 C#

这篇文章主要介绍了winform 调用摄像头扫码识别二维码的实现步骤,帮助大家更好的理解和学习使用winform,感兴趣的朋友可以了解下

因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能。

我根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好)

现在将调用摄像头+识别二维码这两个功能单独出来写到这里,供大家讨论和参考。

有什么不足或者问题大家可以提出来,共同改进共同进步

创建一个空的winform项目解决方案,我起名叫他:ScanQRCode

将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 调用摄像头扫码识别二维码的实现步骤

最终的别结果为:

winform 调用摄像头扫码识别二维码的实现步骤

代码:https://github.com/Binzm/ScanQRCode.git

以上就是winform 调用摄像头扫码识别二维码的实现步骤的详细内容,更多关于winform 调用摄像头识别二维码的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/19930521zhang/p/14330585.html

延伸 · 阅读

精彩推荐
  • C#Unity使用EzySlice实现模型多边形顺序切割

    Unity使用EzySlice实现模型多边形顺序切割

    这篇文章主要为大家详细介绍了Unity使用EzySlice实现模型多边形顺序切割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考...

    Maddie_Mo4932022-09-23
  • C#C#实现根据实体类自动创建数据库表

    C#实现根据实体类自动创建数据库表

    本文主要介绍了C#通过自定义特性实现根据实体类自动创建数据库表的方法。具有很好的参考价值,需要的朋友一起来看下吧...

    天碼行空5102021-12-15
  • C#SuperSocket入门--Telnet服务器和客户端请求处理

    SuperSocket入门--Telnet服务器和客户端请求处理

    本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例。下面跟着小编一起来看下吧...

    黄昏前黎明后10602021-12-21
  • C#详解C#的设计模式编程之抽象工厂模式的应用

    详解C#的设计模式编程之抽象工厂模式的应用

    这篇文章主要介绍了C#的设计模式编程之抽象工厂模式的应用,注意区分一下简单工厂模式、工厂方法模式和抽象工厂模式概念之间的区别,需要的朋友可以参...

    张龙豪6582021-11-12
  • C#C#中枚举的特性 FlagAttribute详解

    C#中枚举的特性 FlagAttribute详解

    说到FlagsAttribute,源自前几天看到了一小段代码,大概意思就是根据航班政策来返回哪些配送方式是否可用,根据这些是否可用来隐藏或者开启界面的相关...

    KenWang3612022-02-20
  • C#C#自定义音乐播放器进度条

    C#自定义音乐播放器进度条

    这篇文章主要为大家详细介绍了C#自定义音乐播放器进度条效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    波谷10702022-01-17
  • C#c# 如何实现图片压缩

    c# 如何实现图片压缩

    这篇文章主要介绍了c# 实现图片压缩的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    龙骑科技5562022-10-18
  • C#巧用Dictionary实现日志数据批量插入

    巧用Dictionary实现日志数据批量插入

    这篇文章主要介绍了巧用Dictionary实现日志数据批量插入,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    UP技术控4532022-10-31