生成二维码

这里需要引用一个库

下载地址:点击查看

引用到我们的项目,然后双击打开对象浏览器

这两个类是主要的。字面意思就很好区别了,一个是把信息生成二维码,一个是把二维码转成信息。

QRCodeEncoder   

namespace ThoughtWorks.QRCode.Codec
{
    public class QRCodeEncoder
    {
        public QRCodeEncoder();

        public virtual Color QRCodeBackgroundColor { get; set; }
        public virtual ENCODE_MODE QRCodeEncodeMode { get; set; }
        public virtual ERROR_CORRECTION QRCodeErrorCorrect { get; set; }
        public virtual Color QRCodeForegroundColor { get; set; }
        public virtual int QRCodeScale { get; set; }
        public virtual int QRCodeVersion { get; set; }

        public virtual bool[][] calQrcode(byte[] qrcodeData);
        public virtual int calStructureappendParity(sbyte[] originaldata);
        public virtual Bitmap Encode(string content);
        public virtual Bitmap Encode(string content, Encoding encoding);
        public virtual void setStructureappend(int m, int n, int p);

        public enum ENCODE_MODE
        {
            ALPHA_NUMERIC,
            NUMERIC,
            BYTE
        }
        public enum ERROR_CORRECTION
        {
            L,
            M,
            Q,
            H
        }
    }
}

 

生成二维码有两种方法:

①先生成二维码图片并保存在服务端,然后围绕这个图片进行处理。

 

 

  <div style="width: 800px; height: 100%; margin: auto;">
            <div>
                <span>编码类型:</span><asp:DropDownList ID="ddlCoding" runat="server"></asp:DropDownList>
            </div>
            <div>
                <span>等级:</span><asp:DropDownList ID="ddlLevel" runat="server"></asp:DropDownList>
            </div>
            <div>
                <span>版本:</span><asp:DropDownList ID="ddlVersion" runat="server"></asp:DropDownList>
            </div>
            <div>
                <span>大小:</span><asp:TextBox ID="txtSize" runat="server" Text="4"></asp:TextBox>
            </div>
            <div>
                <span>存储的数据:</span><asp:TextBox ID="txtData" runat="server"></asp:TextBox>
            </div>
            <asp:Button ID="Button1" runat="server" Text="生成二维码" OnClick="Button1_Click" /><br />

            <asp:ImageButton ID="ImageButton2" runat="server" Height="150px" Width="150px" /><br />

            <%--   <asp:ImageButton ID="ImageButton1" runat="server" Height="150px" Width="150px" /><br />--%>
            <div>
                <span>解码数据:</span><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></asp:TextBox>
            </div>
        </div>

 

  /// <summary>
        /// 
        /// </summary>
        Bitmap CreateQR()
        {
            QRCodeEncoder qe = new QRCodeEncoder();
            //设置编码模式          
            qe.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//字节  自有设置为字节的时候扫码才会是存的数据
           
            //等级
            switch (ddlLevel.SelectedIndex)
            {
                case 0:
                    qe.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;   //错误效验、错误更正(有4个等级:H-L-M-Q)  
                    break;
                case 1:
                    qe.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
                    break;
                case 2:
                    qe.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
                    break;
                case 3:
                    qe.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
                    break;             
            }
                
            qe.QRCodeVersion = ddlVersion.SelectedIndex + 1;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
            qe.QRCodeScale = int.Parse(txtSize.Text);  //// (值越大生成的二维码图片像素越高)
            //  qe.QRCodeBackgroundColor = System.Drawing.Color.Blue;

            //图片名称
            string name = DateTime.Now.ToString("yyyyMMddHHssmm")+".png";          

            //图片路径
            string FullName = Server.MapPath("..")+ "\\img\\" + name;
            // string FullName = Server.MapPath("../img/")+name;

        
           //对数据进行编码并生成Bitmap
            Bitmap map = qe.Encode(txtData.Text, Encoding.Default);  //中文需要编码
            map.Save(FullName);

            //   qe.Encode(txtData.Text) 返回的是Bitmap类型     
            // qe.Encode(txtData.Text,Encoding.Default).Save(FullName);//把图片保存到目标图片

            ImageButton2.ImageUrl ="../img/"+name;

            return map; //返回Bitmao类型,解码需要
        }

你可以选择不同的属性去生成二维码

 

 解码:

一开始你不会知道怎么解码,你可以去看它的类有什么方法

  public class QRCodeDecoder
    {
        public QRCodeDecoder();

        public static DebugCanvas Canvas { get; set; }

        public virtual string decode(QRCodeImage qrCodeImage);
        public virtual string decode(QRCodeImage qrCodeImage, Encoding encoding);
        public virtual sbyte[] decodeBytes(QRCodeImage qrCodeImage);
    }

那你看一眼就知道 decode这个方法了,你在转定义到 QRCodeImage这个类

 

他是一个接口,接口是不能直接new的,我们可以new一个继承这个接口的类。所以我们再去找继承这个接口的类。

 

namespace ThoughtWorks.QRCode.Codec.Data
{
    public class QRCodeBitmapImage : QRCodeImage
    {
        public QRCodeBitmapImage(Bitmap image);  //Bitmap参数

        public virtual int Height { get; }
        public virtual int Width { get; }

        public virtual int getPixel(int x, int y);
    }
}

解码代码也就出来了

    /// <summary>
        /// 解码
        /// </summary>
        /// <param name="mp"></param>
        void DeQR(Bitmap mp)
        {
            //解码
            QRCodeDecoder qd = new QRCodeDecoder();
            QRCodeImage qi = new QRCodeBitmapImage(mp);
            TextBox1.Text = qd.decode(qi, Encoding.Default);
        }
    protected void Button1_Click(object sender, EventArgs e)   //生成事件
        {
          Bitmap mps=CreateQR();  //生成二维码的时候返回Bitmap类型
            DeQR(mps); 
        }

 

 ②以流的形式输出,类似验证码

在页面上添加一个放图片的位子

  把图片地址链接到另一个页面

  protected void Page_Load(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(Request.QueryString["data"]))
            {
                string str = Request.QueryString["data"];

                //初始化二维码生成工具
                QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
                qrCodeEncoder.QRCodeVersion = 0;
                qrCodeEncoder.QRCodeScale = 4;
                //将字符串生成二维码图片
                Bitmap image = qrCodeEncoder.Encode(str, Encoding.Default);

                //保存为PNG到内存流  
                MemoryStream ms = new MemoryStream();
                image.Save(ms, ImageFormat.Png);

                //输出二维码图片
                Response.BinaryWrite(ms.GetBuffer());
                Response.End();
            }
        }

 

posted @ 2017-07-28 14:41  Sealee  阅读(643)  评论(0编辑  收藏  举报