在WPF中开启摄像头扫描二维码(Media+Zxing)

原文:在WPF中开启摄像头扫描二维码(Media+Zxing)

  近两天项目中需要添加一个功能,是根据摄像头来读取二维码信息,然后根据读出来的信息来和数据库中进行对比显示数据。

  选择技术Zxing、WPFMediaKit。基本的原理就是让WPFmediaKit来对摄像头进行操作,然后Zxing这个库对图片进行分析大致就是这样。

  在后台中定义了定时器,用于解析当前摄像头的图像,然后直接读数据。

需要注意的是一定要引入 using WPFMediaKit.DirectShow.Controls; using ZXing;

public partial class YIDong : Page
    {
        public YIDong()
        {
            InitializeComponent();
            cb.ItemsSource = MultimediaUtil.VideoInputNames;//获得所有摄像头
            if (MultimediaUtil.VideoInputNames.Length > 0)
            {
                cb.SelectedIndex = 0;//第0个摄像头为默认摄像头
            }
            else
            {
                MessageBox.Show("电脑没有安装任何可用摄像头");
            }
            cameraTimer.IsEnabled = false;
            cameraTimer.Interval = new TimeSpan(200); //执行间隔0.2秒
            cameraTimer.Tick += cameraTimer_Tick; ;
        }

        /// <summary>
        /// ZXING 二维码扫描类
        /// </summary>
        BarcodeReader codeReader = new BarcodeReader();

        /// <summary>
        /// 定时器
        /// </summary>
        DispatcherTimer cameraTimer = new DispatcherTimer();

        private void cameraTimer_Tick(object sender, EventArgs e)
        {
            RenderTargetBitmap bmp = new RenderTargetBitmap((int)vce.ActualWidth, (int)vce.ActualHeight, 96, 96, PixelFormats.Default);
            vce.Measure(vce.RenderSize);
            vce.Arrange(new Rect(vce.RenderSize));
            bmp.Render(vce);
            BitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            using (MemoryStream ms = new MemoryStream())
            {
                encoder.Save(ms);
                Bitmap btiMap = new Bitmap(ms);
                var result = codeReader.Decode(btiMap);//解析条码
                if (result != null)
                {
                    string shelve_index = result.ToString();
                    ObservableCollection<XModel.STORe_DetailVm> list = XDAL.STORE_goods_Detail.GetGoodsByShelve_Index(shelve_index);
                    Dialog.OpenWindow open = Lib.pubMethod.GetOpenWindow(this);
                    if (open != null)
                    {
                        Application.Current.Properties["SweepList"] = list;
                        open.CloseAsTrue();
                    }
                }
            }
        }

        private void btnCapture_Click(object sender, RoutedEventArgs e)
        {
            cameraTimer.Start();
        }

        private void Restart_Click(object sender, RoutedEventArgs e)
        {
            cameraTimer.Stop();
            vce.Play();
        }

        private void cb_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //控件制定摄像头
            vce.VideoCaptureSource = (string)cb.SelectedItem;
        }

前台布局很简单,

 <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="86*"/>
            <ColumnDefinition Width="237*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="5*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Background="LightBlue" Grid.Row="0" Grid.ColumnSpan="2">
            <wpfmedia:VideoCaptureElement x:Name="vce" Stretch="Fill" Width="auto" Height="auto" Margin="0" Grid.Row="0" RenderTransformOrigin="0.5,0.5">
                <wpfmedia:VideoCaptureElement.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform/>
                        <SkewTransform/>
                        <TranslateTransform/>
                    </TransformGroup>
                </wpfmedia:VideoCaptureElement.RenderTransform>
            </wpfmedia:VideoCaptureElement>
        </StackPanel>

        <Label x:Name="label" Content="摄像头:" Grid.Row="1" Grid.Column="0"  Width="49" HorizontalAlignment="Right" Margin="0,14,0,4" />
        <ComboBox x:Name="cb" Style="{StaticResource Query_Combo}" Grid.Row="1" Width="204" HorizontalAlignment="Left" Margin="2,13,0,8" SelectionChanged="cb_SelectionChanged" Grid.Column="1"  />
        <Button  Content="开始" x:Name="btnCapture" Style="{StaticResource Query_Button}" Click="btnCapture_Click"  Width="50" Grid.Row="2" Grid.Column="1" Height="20" HorizontalAlignment="Left" Margin="9,10,0,14"/>
        <Button  Content="暂停" x:Name="btnReStart" Style="{StaticResource Query_Button}" Click="Restart_Click" Width="50" Grid.Row="2" Grid.Column="1" Height="20" HorizontalAlignment="Left" Margin="67,11,0,15"/>

    </Grid>

需要注意的是xaml一定要引入  xmlns:wpfmedia="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit" 。

效果如下。

原文地址:https://www.cnblogs.com/lonelyxmas/p/12052137.html

时间: 2024-10-03 22:41:38

在WPF中开启摄像头扫描二维码(Media+Zxing)的相关文章

使用vue做移动app时,调用摄像头扫描二维码

现在前端技术发展飞快,前端都能做app了,那么项目中,也会遇到调用安卓手机基层的一些功能,比如调用摄像头,完成扫描二维码功能 下面我就为大家讲解一下,我在项目中调用这功能的过程. 首先我们需要一个中间框架,hbuilder http://www.html5plus.org/doc/zh_cn/accelerometer.html 这个是html5+的文档地址,我们找到Barcode模块, 有这么多,然后我们往下找 找到这段代码 <!DOCTYPE html> <html> <

在iOS中使用ZBar扫描二维码

最近在做的项目中需要用到二维码扫描功能,之前在Android中使用过ZXing识别二维码,ZXing也有对应的iOS版本,经过了解,ZBar也是一个常用的二维码识别软件,并分别提供了iOS和Android的SDK可供使用,最终我选择了ZBar进行二维码识别,它的注释清晰,便于使用. ZBar为我们提供了两种使用方式,一种是直接调用ZBar提供的ZBarReaderViewController打开一个扫描界面,另一种方式是使用ZBar提供的可以嵌在其他视图中的ZBarReaderView,实际项目

在iOS中使用ZBar扫描二维码和条形码

最近做了个外包项目,里面用到了二维码扫描和微信支付!之前比较熟悉的是ZXing,但是在Xcode7.1里面发现竟然莫名的不支持,木有办法,从网上查了一下还有一种支持二维码扫描的东西,没错就是接下来我要说的东东,二维码扫描的利器 ZBarSDK.闲言少絮叨,言归正传! 1.下载 ZBarSDK 官网 https://github.com/bmorton/ZBarSDK 2.导入如下框架 3.在AppDelegetem文件中#import "ZBarSDK.h" 并且 在 - (BOOL)

iOS中使用ZBar扫描二维码自定义扫描界面

之前在Android中使用过ZXing识别二维码,ZXing也有对应的iOS版本,经过了解,ZBar也是一个常用的二维码识别软件,并分别提供了iOS和Android的SDK可供使用,最终我选择了ZBar进行二维码识别,它的注释清晰,便于使用. ZBar为我们提供了两种使用方式,一种是直接调用ZBar提供的ZBarReaderViewController打开一个扫描界面,另一种方式是使用ZBar提供的可以嵌在其他视图中的ZBarReaderView,实际项目中我们更可能会使用第二种方式,这可以让我

打开手机摄像头扫描二维码或条形码全部操作

(1)下载二维码的库源码 链接:http://pan.baidu.com/s/1pKQyw2n 密码:r5bv 下载完成后打开可以看到 libzxing 的文件夹,最后添加进 Android  Studio,操作 :File------>New----->Import  Moudle (2)按钮单击事件为  scanner 后台代码: public void scanner(View view){ startActivityForResult(new Intent(ScanActivity.t

Unity3d 打开本地摄像头扫描二维码

首先 下载ZXing.Net.0.12.0.0.zip,下载地址为http://zxingnet.codeplex.com/. ’解压找到unity文件夹,然后将其放到unity工程. using UnityEngine;using System.Collections;using ZXing;using UnityEngine.UI; public class QRcode : MonoBehaviour{ public Color32[] data; private bool isScan;

Ionic2学习笔记(10):扫描二维码

作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5575843.html 时间:6/11/2016 ? ? 说明: 在本文发表的时候(2016-06-11),Ionic2是beta版本,所有还是会有一些改动比较大的地方: 点击查看 , 比如beta8版本(2016-06-06),相较于前面的版本就有一个特别大的改动的地方: @App and @Page should be replaced with @Component 基于这种情况,大家还是静静

iOS中 扫描二维码/生成二维码详解 韩俊强的博客

最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[SecondViewController new]]; 每日更新关注:http://weibo.com/hanjunqi

vue中,使用手机钉钉扫描二维码登录

最新项目要做一个,使用手机钉钉扫描二维码登录pc系统的功能,手机扫码二维码后,会弹出一个确定登录的页面,点击确定之后,pc端就会登录进去 第一步:查看钉钉开发平台 钉钉开发平台(钉钉官网) 从官网中了解到: 使用钉钉js-api提供的获取免登授权码接口获取CODE,此jsapi无需鉴权 然后通过CODE,获取用户身份信息 第二步:pc页面 npm install v-qrcode --save 并在页面中注册引入 其中  qrcode是二维码内容,在data中定义, 调用后端接口,获取钉钉登录二