自动解析 摄像头中的二维码
using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System.Runtime.InteropServices;using System.Text;using System.Windows.Forms;using ZXing;using ZXing.Common;using ZXing.QrCode;namespace QRCodeService{ public partial class MainForm : Form { //摄像头对象 private Capture cam; //计时器 System.Timers.Timer _timer = null; //扫描时间频率(毫秒) private int scanTime = 250; private bool videoState = false; private IContainer componentss; public MainForm() { Control.CheckForIllegalCrossThreadCalls = false; InitializeComponent(); pictureBox1.Visible = false; btnStop.Enabled = false; } //点击开始扫描 private void btnStart_Click(object sender, EventArgs e) { Console.WriteLine("摄像头启动"); btnStart.Enabled = false; btnStop.Enabled = true; StartCam(); if (_timer != null && _timer.Enabled) { _timer.Stop(); _timer.Dispose(); } //定时器启动,设置扫描频率 _timer = new System.Timers.Timer(scanTime); _timer.Start(); _timer.Elapsed = new System.Timers.ElapsedEventHandler(_timer_Elapsed); } //定时器工作 void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Console.WriteLine("扫描开始"); try { //摄像头截屏 string result = SnapShot(); if (string.IsNullOrEmpty(result)) { if (pictureBox1.Image == null) { return; } else { try { result = RQDecode(new Bitmap(pictureBox1.Image)); Console.WriteLine(result); } catch (Exception ss) { } if (null != result && !string.IsNullOrEmpty(result)) { this.textBoxMsg1.Text = result; CreateQRCode(result); Console.WriteLine("扫描完毕"); } else { Console.WriteLine("未扫描到二维码。"); this.textBoxMsg1.Text = "未扫描到二维码。"; pictureBox3.Image = null; } } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } Console.WriteLine("扫描结束"); } //点击停止扫描 private void btnStop_Click(object sender, EventArgs e) { Console.WriteLine("摄像头关闭"); btnStop.Enabled = false; btnStart.Enabled = true; textBoxMsg1.Text = string.Empty; //摄像头停止 StopCam(); //计时器循环扫描停止 _timer.Stop(); _timer.Dispose(); } //生成二维码,并显示到界面 private void CreateQRCode(string content) { EncodingOptions options = null; BarcodeWriter writer = null; options = new QrCodeEncodingOptions { DisableECI = true, CharacterSet = "UTF-8", Width = pictureBox3.Width, Height = pictureBox3.Height }; writer = new BarcodeWriter(); writer.Format = BarcodeFormat.QR_CODE; writer.Options = options; Bitmap bitmap = writer.Write(content); pictureBox3.Image = bitmap; } //--截图 private string SnapShot() { Cursor.Current = Cursors.WaitCursor; if (m_ip != IntPtr.Zero) { Marshal.FreeCoTaskMem(m_ip); m_ip = IntPtr.Zero; } m_ip = cam.Click(); Bitmap b = new Bitmap(cam.Width, cam.Height, cam.Stride, PixelFormat.Format24bppRgb, m_ip); b.RotateFlip(RotateFlipType.RotateNoneFlipY); b = ResizeImage(b, pictureBox1); pictureBox1.Image = b; Bitmap bit = null; bit = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics g = Graphics.FromImage(bit); g.CopyFromScreen(this.PointToScreen(pictureBox1.Location), new Point(0, 0), bit.Size); g.Dispose(); string result = string.Empty; try { //扫描二维码 result = RQDecode(bit); Console.WriteLine(result); } catch (Exception ex) { } if (!string.IsNullOrEmpty(result)) { //生成二维码 CreateQRCode(result); } Cursor.Current = Cursors.Default; return result; } //--重置图像大小 private Bitmap ResizeImage(Bitmap bmp, PictureBox picBox) { float xRate = (float)bmp.Width / picBox.Size.Width; float yRate = (float)bmp.Height / picBox.Size.Height; if (xRate <= 1 && yRate <= 1) { return bmp; } else { float tRate = (xRate >= yRate) ? xRate : yRate; Graphics g = null; try { int newW = (int)(bmp.Width / tRate); int newH = (int)(bmp.Height / tRate); Bitmap b = new Bitmap(newW, newH); g = Graphics.FromImage(b); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel); g.Dispose(); return b; } catch { return null; } finally { if (null != g) { g.Dispose(); } } } } //--解码 private string RQDecode(Bitmap img) { string errText = string.Empty; Result result = null; if (img != null) { try { result = new BarcodeReader().Decode(img); } catch { return errText; } if (result != null) { return result.Text; } else { return errText; } } else { return errText; } } //--开启摄像头 private void StartCam() { const int VIDEODEVICE = 0; const int VIDEOWIDTH = 640; const int VIDEOHEIGHT = 480; const int VIDEOBITSPERPIXEL = 32; cam = new Capture(VIDEODEVICE, VIDEOWIDTH, VIDEOHEIGHT, VIDEOBITSPERPIXEL, pictureBox2); videoState = true; } //--停止摄像头 private void StopCam() { cam.Dispose(); if (m_ip != IntPtr.Zero) { Marshal.FreeCoTaskMem(m_ip); m_ip = IntPtr.Zero; } videoState = false; } private void pictureBox1_Paint(object sender, PaintEventArgs e) { PictureBox p = (PictureBox)sender; Pen pp = new Pen(System.Drawing.Color.Red); e.Graphics.DrawRectangle(pp, e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.X e.ClipRectangle.Width - 1, e.ClipRectangle.Y e.ClipRectangle.Height - 1); } private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { try { StopCam(); } catch (Exception ex) { } try { Dispose(); } catch(Exception exx) { } } }}
评论