实例介绍
【实例简介】自动解析 摄像头中的二维码
【实例截图】
【实例截图】

【核心代码】
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) { } } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论