zoukankan      html  css  js  c++  java
  • 生成二维码

    这里需要引用一个库

    下载地址:点击查看

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

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

    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=" 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();
                }
            }
  • 相关阅读:
    BZOJ5104 二次剩余板子
    BZOJ5329 [Sdoi2018]战略游戏 圆方树+虚树
    BZOJ1095 动态点分治
    BZOJ3992: [SDOI2015]序列统计
    kd-tree板子
    thusc2018翻车记
    BZOJ5336 DP套DP
    BZOJ4316 仙人掌DP
    问题 F: 最小花费
    问题 C: 热浪
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/7250130.html
Copyright © 2011-2022 走看看