zoukankan      html  css  js  c++  java
  • 二维码生成及读取方法

    二维码的制作主要是引用第三方的程序集ThoughtWorks.QRCode.dll,调用QRCodeEncoder的Encode方法得到一个Bitmap图;相反,解析二维码就是用的Decode方法。

    如下示例生成二维码的方法:

    /// <summary>
            /// 生成不带logo的二维码图片
            /// </summary>
            /// <param name="data">要生成二维码的字符串</param>
            /// <returns></returns>
            public System.Drawing.Image GCode(String data)
            {
                QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
                String encoding = cboEncoding.Text;//QRCodeEncodeMode是枚举类型,此处是使用ComboBox给用户自行选择
                if (encoding == "Byte")
                {
                    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
                }
                else if (encoding == "AlphaNumeric")
                {
                    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
                }
                else if (encoding == "Numeric")
                {
                    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
                }
                try
                {
                    int scale = Convert.ToInt16(txtSize.Text);
                    qrCodeEncoder.QRCodeScale = scale;//二维码尺寸大小
                }
                catch (Exception)
                {
                    MessageBox.Show("Invalid size!");
                    return null;
                }
                try
                {
                    int version = Convert.ToInt16(cboVersion.Text);
                    qrCodeEncoder.QRCodeVersion = version;//版本
                }
                catch (Exception)
                {
                    MessageBox.Show("Invalid version !");
                }
    
                string errorCorrect = cboCorrectionLevel.Text;
                if (errorCorrect == "L")
                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
                else if (errorCorrect == "M")
                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
                else if (errorCorrect == "Q")
                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
                else if (errorCorrect == "H")
                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
    
                Image pbImg = qrCodeEncoder.Encode(data);
                return pbImg;
            }


    如果要生成一个中间带一个小图片的二维码,则需要使用GDI+将图片画到已经生成的二维码图片上(注意,中间小图片的大小要控制好,否则可能会遮挡二维码有效信息,导致读不出来,):

     /// <summary>
            /// 生成带logo二维码的图片
            /// </summary>
            /// <param name="imgBack">背景图片</param>
            /// <param name="destImg">logo图片</param>
            /// <returns></returns>
            public static System.Drawing.Image CombinImage(System.Drawing.Image imgBack, string destImg)
            {
                if (imgBack == null)//如果二维码生成出错
                {
                    return null;
                }
                try
                {
                    System.Drawing.Image img = System.Drawing.Image.FromFile(destImg);//拿到logo图片  
                    if (img.Height != 50 || img.Width != 50)
                    {
                        img = KiResizeImage(img, 50, 50);//调整logo图片大小
                    }
                    Graphics g = Graphics.FromImage(imgBack);
                    g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Height / 2 - img.Height / 2, img.Width, img.Height);//把logo画到二维码上
                    GC.Collect();
                    return imgBack;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Logo image error!");//如果选择的Logo图片未获取到,则抛出异常
                    return null;
                }
            }
    
            /// <summary>
            /// 调整logo图片的大小
            /// </summary>
            /// <param name="bmp">logo图片</param>
            /// <param name="newW"></param>
            /// <param name="newH"></param>
            /// <returns>返回处理好的图片</returns>
            public static System.Drawing.Image KiResizeImage(System.Drawing.Image bmp, int newW, int newH)
            {
                try
                {
                    System.Drawing.Image b = new Bitmap(newW, newH);//创建一个空白图片
                    Graphics g = Graphics.FromImage(b);//把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;
                }
    
            }
    View Code

    好了,对于二维码的制作和解析,以上内容对于使用者基本够用了,如果感兴趣的话,可以使用Reflector反编译查看ThoughtWorks.QRCode.dll内部到底是如何实现的

  • 相关阅读:
    Android List 排序
    Android Connection refused
    动态代理
    Java内存模型
    面试题整理
    检查结果
    单例模式
    2019年面试记录
    面试题目
    滑动窗口的最大值
  • 原文地址:https://www.cnblogs.com/jerrylucky/p/3919807.html
Copyright © 2011-2022 走看看