C# QRCode、DataMatrix和其他条形码的生成和解码软件

编程语言 12/26 阅读 735 views次 人气 0
摘要:

今天制造了一个C#的软件,具体是用于生成二维码和条形码的,包括常用的QRCode、DataMatrix、Code128、EAN-8等等。

使用的第三方类库是Zxing.net和DataMatrix.net;另外,程序中也用了委托。

(这两个类库可以在VS2015的NuGet管理器中下载)

但说明一下,其中发现PDF_417是有问题,具体问题是生成的条形码,再解析为字符串时,前面多了“A ”,也不知道是什么原因,反正我很少用到PDF_417,就算了,但其他的编码已经测试过是没问题的。


效果图:

使用非常简单,用法是:从ListView中选择编码类型,然后在Content中输入内容,点击“Encode”则在PictureBox中生成编码,下方的save可以保存图片,open则是打开本地的编码图片,点击“Decode”后即可自动解码。


下面直接上代码(第一段代码是Helper,后面的代码如果不感兴趣可以忽略):

(1)CodeHelper

using DataMatrix.net;
using System.Collections.Generic;
using System.Drawing;
using ZXing;
using ZXing.Aztec;
using ZXing.Common;
using ZXing.OneD;
using ZXing.PDF417;
using ZXing.QrCode;

namespace CodeHelper
{
    public class CodeHelper
    {
        #region 编码
        public static Bitmap Encode_QR(string content, int width = 100, int margin = 1)
        {
            QrCodeEncodingOptions opt = new QrCodeEncodingOptions();
            opt.DisableECI = true;
            opt.CharacterSet = "UTF-8";
            opt.Width = width;
            opt.Height = width;
            opt.Margin = margin;

            BarcodeWriter wr = new BarcodeWriter();
            wr.Options = opt;
            wr.Format = BarcodeFormat.QR_CODE;

            Bitmap bm = wr.Write(content);
            return bm;
        }

        public static Bitmap Encode_DM(string content, int moduleSize = 5, int margin = 5)
        {
            DmtxImageEncoderOptions opt = new DmtxImageEncoderOptions();
            opt.ModuleSize = moduleSize;
            opt.MarginSize = margin;

            DmtxImageEncoder encoder = new DmtxImageEncoder();

            Bitmap bm = encoder.EncodeImage(content, opt);
            return bm;
        }

        public static Bitmap Encode_PDF_417(string content, int width = 100, int margin = 5)
        {
            PDF417EncodingOptions opt = new PDF417EncodingOptions();
            opt.Width = width;
            opt.Margin = margin;
            opt.CharacterSet = "UTF-8";

            BarcodeWriter wr = new BarcodeWriter();
            wr.Options = opt;
            wr.Format = BarcodeFormat.PDF_417;

            Bitmap bm = wr.Write(content);
            return bm;
        }

        public static Bitmap Encode_AZTEC(string content, int width = 100, int margin = 1)
        {
            AztecEncodingOptions opt = new AztecEncodingOptions();
            opt.Width = width;
            opt.Height = width;
            opt.Margin = margin;

            BarcodeWriter wr = new BarcodeWriter();
            wr.Options = opt;
            wr.Format = BarcodeFormat.AZTEC;

            Bitmap bm = wr.Write(content);
            return bm;
        }

        public static Bitmap Encode_Code_128(string content, int heigt = 40, int margin = 5)
        {
            Code128EncodingOptions opt = new Code128EncodingOptions();
            opt.Height = heigt;
            opt.Margin = margin;

            BarcodeWriter wr = new BarcodeWriter();
            wr.Options = opt;
            wr.Format = BarcodeFormat.CODE_128;

            Bitmap bm = wr.Write(content);
            return bm;
        }

        public static Bitmap Encode_Code_39(string content, int height = 30, int margin = 1)
        {
            EncodingOptions encodeOption = new EncodingOptions();
            encodeOption.Height = height;
            encodeOption.Margin = margin;

            BarcodeWriter wr = new BarcodeWriter();
            wr.Options = encodeOption;
            wr.Format = BarcodeFormat.CODE_39;

            Bitmap bm = wr.Write(content);
            return bm;
        }

        public static Bitmap Encode_EAN_8(string content, int height = 50, int margin = 1)
        {
            EncodingOptions encodeOption = new EncodingOptions();
            encodeOption.Height = height;
            encodeOption.Margin = margin;

            BarcodeWriter wr = new BarcodeWriter();
            wr.Options = encodeOption;
            wr.Format = BarcodeFormat.EAN_8;

            Bitmap bm = wr.Write(content);
            return bm;
        }

        public static Bitmap Encode_EAN_13(string content, int height = 50, int margin = 1)
        {
            EncodingOptions encodeOption = new EncodingOptions();
            encodeOption.Height = height;
            encodeOption.Margin = margin;

            BarcodeWriter wr = new BarcodeWriter();
            wr.Options = encodeOption;
            wr.Format = BarcodeFormat.EAN_13;

            Bitmap bm = wr.Write(content);
            return bm;
        }
        #endregion

        #region 编码重载
        public static Bitmap Encode_QR(string content)
        {
            return Encode_QR(content, 100, 1);
        }

        public static Bitmap Encode_DM(string content)
        {
            return Encode_DM(content, 5, 5);
        }

        public static Bitmap Encode_PDF_417(string content)
        {
            return Encode_PDF_417(content, 100, 5);
        }

        public static Bitmap Encode_AZTEC(string content)
        {
            return Encode_AZTEC(content, 100, 1);
        }

        public static Bitmap Encode_Code_128(string content)
        {
            return Encode_Code_128(content, 40, 5);
        }

        public static Bitmap Encode_Code_39(string content)
        {
            return Encode_Code_39(content, 30, 1);
        }

        public static Bitmap Encode_EAN_8(string content)
        {
            return Encode_EAN_8(content, 50, 1);
        }

        public static Bitmap Encode_EAN_13(string content)
        {
            return Encode_EAN_13(content, 50, 1);
        }
        #endregion

        /// <summary>
        /// 全部编码类型解码
        /// </summary>
        /// <param name="bm"></param>
        /// <returns></returns>
        public static string Decode(Bitmap bm)
        {
            DecodingOptions opt = new DecodingOptions();
            opt.PossibleFormats = new List<BarcodeFormat>()
            {
                BarcodeFormat.QR_CODE,
                BarcodeFormat.DATA_MATRIX,
                BarcodeFormat.PDF_417,
                BarcodeFormat.AZTEC,
                BarcodeFormat.CODE_128,
                BarcodeFormat.CODE_39,
                BarcodeFormat.EAN_8,
                BarcodeFormat.EAN_13
            };
            opt.CharacterSet = "UTF-8";

            BarcodeReader reader = new BarcodeReader();
            reader.Options = opt;
            Result rs = reader.Decode(bm);
            if (rs != null)
            {
                return rs.Text;
            }

            //DM
            DmtxImageDecoder decoder = new DmtxImageDecoder();
            List<string> list = decoder.DecodeImage(bm);
            if (list.Count > 0)
            {
                return list[0];
            }

            return "";
        }
    }
}


(2)Codes类:

 using System.Collections.Generic;
using System.Drawing;
using ZXing;

namespace CodeHelper
{
    public class Code
    {
        public string Name { get; set; }

        public BarcodeFormat Type { get; set; }

        public delegateGetBm GetBm { get; set; }
    }

    public delegate Bitmap delegateGetBm(string content);

    public class Codes
    {
        public Dictionary<int, Code> list { get; set; }

        public Codes()
        {
            list = new Dictionary<int, Code>();
            list.Add(0, new Code { Name = "QR_CODE", Type = BarcodeFormat.QR_CODE, GetBm = CodeHelper.Encode_QR });
            list.Add(1, new Code { Name = "DATA_MATRIX", Type = BarcodeFormat.DATA_MATRIX, GetBm = CodeHelper.Encode_DM });
            list.Add(2, new Code { Name = "PDF_417", Type = BarcodeFormat.PDF_417, GetBm = CodeHelper.Encode_PDF_417 });
            list.Add(3, new Code { Name = "AZTEC", Type = BarcodeFormat.AZTEC, GetBm = CodeHelper.Encode_AZTEC });
            list.Add(4, new Code { Name = "CODE_128", Type = BarcodeFormat.CODE_128, GetBm = CodeHelper.Encode_Code_128 });
            list.Add(5, new Code { Name = "CODE_39", Type = BarcodeFormat.CODE_39, GetBm = CodeHelper.Encode_Code_39 });
            list.Add(6, new Code { Name = "EAN_8", Type = BarcodeFormat.EAN_8, GetBm = CodeHelper.Encode_EAN_8 });
            list.Add(7, new Code { Name = "EAN_13", Type = BarcodeFormat.EAN_13, GetBm = CodeHelper.Encode_EAN_13 });
        }
    }
}


(3)主界面的后台代码:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace CodeHelper
{
    public partial class FrmMain : Form
    {
        public Codes Codes = new Codes();

        public FrmMain()
        {
            InitializeComponent();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            BindListViewItem();
            lvType.Items[0].Selected = true;
        }

        private void btnEncode_Click(object sender, EventArgs e)
        {
            string content = txtContent.Text;

            int index = lvType.SelectedItems[0].Index;
            try
            {
                pbCode.Image = Codes.list[index].GetBm(content);
            }
            catch (Exception ex)
            {
                txtContent.Text = "";
                pbCode.Image = null;
                MessageBox.Show(ex.Message);
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (pbCode.Image == null)
            {
                MessageBox.Show("there is no code.");
                return;
            }

            bool isSave = true;
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Title = "图片保存";
            sfd.Filter = @"jpeg|*.jpg|bmp|*.bmp|png|*.png";
            sfd.FileName = txtContent.Text;

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                string fileName = sfd.FileName.ToString();
                if (fileName != "" && fileName != null)
                {
                    string fileExtName = fileName.Substring(fileName.LastIndexOf(".") + 1).ToString();
                    System.Drawing.Imaging.ImageFormat imgformat = null;
                    if (fileExtName != "")
                    {
                        switch (fileExtName)
                        {
                            case "jpg":
                                imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                                break;
                            case "bmp":
                                imgformat = System.Drawing.Imaging.ImageFormat.Bmp;
                                break;
                            case "png":
                                imgformat = System.Drawing.Imaging.ImageFormat.Gif;
                                break;
                            default:
                                MessageBox.Show("只能保存为: jpg,bmp,png 格式");
                                isSave = false;
                                break;
                        }
                    }
                    if (imgformat == null)
                    {
                        imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                    }
                    if (isSave)
                    {
                        try
                        {
                            pbCode.Image.Save(fileName, imgformat);
                        }
                        catch
                        {
                            MessageBox.Show("保存失败,还没有图片或已经清空图片!");
                        }
                    }
                }
            }
        }

        private void BindListViewItem()
        {
            lvType.View = View.LargeIcon;
            lvType.LargeImageList = imgList;
            lvType.BeginUpdate();

            for (int i = 0; i < Codes.list.Count; i++)
            {
                ListViewItem lvi = new ListViewItem();
                lvi.ImageIndex = i;
                lvi.Text = Codes.list[i].Name;
                lvType.Items.Add(lvi);
            }
            lvType.EndUpdate();
        }

        private void btnDecode_Click(object sender, EventArgs e)
        {
            txtContent.Text = "";

            Bitmap bm = (Bitmap)pbCode.Image;
            try
            {
                txtContent.Text = CodeHelper.Decode(bm);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            txtContent.Text = "";
            pbCode.Image = null;

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "打开图片";
            ofd.Filter = @"所有文件|*.*|jpeg|*.jpg|bmp|*.bmp|png|*.png";

            if (ofd.ShowDialog() == DialogResult.OK)
                pbCode.Image = Image.FromFile(ofd.FileName);
        }

        private void lvType_SelectedIndexChanged(object sender, EventArgs e)
        {
            pbCode.Image = null;
        }
    }
}

界面的控件:

Label lblType;

ListView lvType;

Button btnEncode;

Button btnDecode;

PictureBox pbCode;

TextBox txtContent;

Label lblContent;

Button btnSave;

Button btnOpen;

ImageList imgList;


就这样吧,欢迎交流。

评论

该文章不支持评论!

分享到: