码迷,mamicode.com
首页 > Windows程序 > 详细

C#_WPF中创建二维码、识别二维码

时间:2019-06-04 09:24:33      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:sharp   tle   map   dict   二维码   enable   nuget   writer   return   

第三方库:

  WPFMediaKit.dll (WPFMediaKit摄像头处理)

  zing.dll

技术图片

 

NuGet安装这两个第三方dll

 技术图片

技术图片

 

 

项目截图预览:

技术图片

 

 项目代码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using WPFMediaKit.DirectShow.Controls;
using ZXing;
using ZXing.Common;
using ZXing.QrCode.Internal;

namespace QRcode
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {

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

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

        public MainWindow()
        {
            InitializeComponent();

            // 配置的摄像头名称
            var camera = "Lenovo EasyCamera";
            if (MultimediaUtil.VideoInputNames.Contains(camera))
            {
                //控件制定摄像头
                vce.VideoCaptureSource = camera;
                cameraTimer.IsEnabled = false;
                cameraTimer.Interval = new TimeSpan(200); //执行间隔0.2秒
                cameraTimer.Tick += cameraTimer_Tick;

            }


        }
        /// <summary>
        /// 计时器方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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)
                {
                    // 1:停止识别
                    cameraTimer.Stop();
                    vce.Play(); 
                    MessageBox.Show($"识别内容为:{result}");

                }
            }
        }

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

        private void BtnShnegCeng_Click(object sender, RoutedEventArgs e)
        {
           var codimg= Create("hello world!!");
            imgQR.Source = ChangeBitmapToImageSource(codimg);
        }
        /// <summary>
        /// 创建二维码
        /// </summary>
        /// <param name="msg">二维码中保存的信息</param>
        /// <returns></returns>
        public static Bitmap Create(string msg)
        {
            MultiFormatWriter writer = new MultiFormatWriter();
            Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
            //设置二维码为utf-8编码
            hint.Add(EncodeHintType.CHARACTER_SET, "utf-8");
            //设置纠错等级, 高
            hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            BitMatrix bm = writer.encode(msg, BarcodeFormat.QR_CODE, 200, 120, hint);
            BarcodeWriter barcodeWriter = new BarcodeWriter();
            Bitmap bitmap = barcodeWriter.Write(bm);
            string codePath = Directory.GetCurrentDirectory() + "/code.jpg";
            if (File.Exists(codePath))
                File.Delete(codePath);
            bitmap.Save(codePath);
            return bitmap;
        }
        /// <summary>
        /// 从bitmap转换成ImageSource
        /// </summary>
        /// <param name="icon"></param>
        /// <returns></returns>
        public static ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
        {
            IntPtr hBitmap = bitmap.GetHbitmap();

            ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());

            if (!DeleteObject(hBitmap))
            {
                throw new System.ComponentModel.Win32Exception();
            }
            return wpfBitmap;
        }

        [DllImport("gdi32.dll", SetLastError = true)]
        private static extern bool DeleteObject(IntPtr hObject);
    }
}

  

 项目源代码地址:https://download.csdn.net/download/qingchundaima/11151083

 

C#_WPF中创建二维码、识别二维码

标签:sharp   tle   map   dict   二维码   enable   nuget   writer   return   

原文地址:https://www.cnblogs.com/wendj/p/10789877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!