zoukankan      html  css  js  c++  java
  • [.NET]二维码生成

    又好一段时间没有写写东西了,继续回归原来的模式,多做记录,最近要实现个unity的二维码方面的功能,首先就要解决生成二维码的问题,这个倒是有这方面的组件,然后我通过强大的反编译工具Reflector(想必.NET程序都知道的神器),来插件内部实现的原理。废话不多说,先看效果二维码在线生成工具,附带一句这里是QR码

    在线测试:http://114.92.234.2:5005/

    效果图

    了解QR码

    项目解析

    1.用反编译神器来查看组件的内部实现原理

    a)生成图片方法

    主要的就是这个方法是用来生成一张二维码图片的,其中this.calQrcode(encoding.GetBytes(content))这个方法是生成二维码对应图片的一个bool数组,然后就是通过这个0,1数组来绘制成二维码

    [csharp] view plaincopyprint?
     
    1. public virtual Bitmap Encode(string content, Encoding encoding)  
    2. {  
    3.     //计算得到bool值数组  
    4.     bool[][] flagArray = this.calQrcode(encoding.GetBytes(content));  
    5.     //定义画刷  
    6.     SolidBrush brush = new SolidBrush(this.qrCodeBackgroundColor);  
    7.     Bitmap image = new Bitmap((flagArray.Length * this.qrCodeScale) + 1, (flagArray.Length * this.qrCodeScale) + 1);  
    8.     //绘图  
    9.     Graphics graphics = Graphics.FromImage(image);  
    10.     //绘制二维码背景  
    11.     graphics.FillRectangle(brush, new Rectangle(0, 0, image.Width, image.Height));  
    12.     //设置背景颜色  
    13.     brush.Color = this.qrCodeForegroundColor;  
    14.     //根据bool数组绘制前端二维码  
    15.     for (int i = 0; i < flagArray.Length; i++)  
    16.     {  
    17.         for (int j = 0; j < flagArray.Length; j++)  
    18.         {  
    19.             if (flagArray[j][i])  
    20.             {  
    21.                 graphics.FillRectangle(brush, j * this.qrCodeScale, i * this.qrCodeScale, this.qrCodeScale, this.qrCodeScale);  
    22.             }  
    23.         }  
    24.     }  
    25.     return image;  
    26. }  

    b)生成bool数组方法以及原理

    这里主要是用到

    创建.NET应用程序

    Default.aspx

    1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>  
    2.   
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    4.   
    5. <html xmlns="http://www.w3.org/1999/xhtml">  
    6. <head runat="server">  
    7.     <title>无标题页</title>  
    8. </head>  
    9. <body>  
    10.     <form id="form1" runat="server">  
    11.     <div>  
    12.         请输入内容:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>  
    13.         <br />  
    14.         生成的文件夹名称:<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>  
    15.         <br/>  
    16.         生成的二维码名称:<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>  
    17.         <br/>  
    18.         <asp:Label ID="Label1" runat="server" Text=""></asp:Label>  
    19.         <br/>  
    20.         <asp:Button ID="Button1" runat="server" Text="生成二维码" onclick="Button1_Click" />  
    21.     </div>  
    22.     <div>  
    23.     <a href="http://blog.csdn.net/dingxiaowei2013">项目解析</a>  
    24.     </div>  
    25.     </form>  
    26. </body>  
    27. </html>  


    Default.aspx.cs

    [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
     
      1. using System;  
      2.   
      3. using ThoughtWorks.QRCode.Codec;  
      4. using System.IO;  
      5. using System.Text;  
      6. using System.Drawing;  
      7.   
      8.   
      9. public partial class _Default : System.Web.UI.Page   
      10. {  
      11.    
      12.     protected void Page_Load(object sender, EventArgs e)  
      13.     {  
      14.           
      15.           
      16.     }  
      17.     protected void Button1_Click(object sender, EventArgs e)  
      18.     {  
      19.         QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();  
      20.         //设置背景颜色  
      21.         //qrCodeEncoder.QRCodeBackgroundColor = Color.FromArgb(255, 255, 0);  
      22.         //设置前景色  
      23.         //qrCodeEncoder.QRCodeForegroundColor = Color.GreenYellow;  
      24.         //编码格式  
      25.         qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;  
      26.   
      27.         //设置每个二维码像素点的大小  
      28.         qrCodeEncoder.QRCodeScale = 4;  
      29.         //QR码版本  
      30.         //QR码所允许规格系列为21×21模块(版本1)~177×177模块(版本40)  
      31.         qrCodeEncoder.QRCodeVersion = 8;  
      32.         //纠错等级  
      33.         //level L : 最大 7% 的错误能够被纠正;   
      34.         //level M : 最大 15% 的错误能够被纠正;    
      35.         //level Q : 最大 25% 的错误能够被纠正;    
      36.         //level H : 最大 30% 的错误能够被纠正;  
      37.         qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;  
      38.   
      39.         //自定义的二维码数据  
      40.         String data = TextBox1.Text.ToString();  
      41.         //Response.Write(data);  
      42.         //画图  
      43.         System.Drawing.Bitmap image = qrCodeEncoder.Encode(data);  
      44.   
      45.         System.IO.MemoryStream MStream = new System.IO.MemoryStream();  
      46.   
      47.         image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png);  
      48.   
      49.         Response.ClearContent();  
      50.   
      51.         Response.ContentType = "image/Png";  
      52.         //写图片  
      53.         Response.BinaryWrite(MStream.ToArray());  
      54.   
      55.   
      56.         //文件路径  
      57.         //FileInfo f = new FileInfo(@"d:zl.png");  
      58.         //Directory.CreateDirectory("d:\"+TextBox2.Text.Trim());  
      59.         //当前项目路径  
      60.         Directory.CreateDirectory(Server.MapPath("~/")+"images"+"//"+TextBox2.Text.Trim());  
      61.         if (!File.Exists(Server.MapPath("~/") + "images" + "//" + TextBox2.Text.Trim() + "//" + TextBox3.Text.Trim() + ".png"))  
      62.         {  
      63.             //FileStream fs = new FileStream("d:\" + TextBox2.Text.Trim() + "\" + TextBox3.Text.Trim() + ".png", FileMode.CreateNew, FileAccess.ReadWrite);  
      64.             FileStream fs = new FileStream(Server.MapPath("~/") + "images" + "//" + TextBox2.Text.Trim() + "//" + TextBox3.Text.Trim() + ".png", FileMode.CreateNew, FileAccess.ReadWrite);  
      65.             BinaryWriter bw = new BinaryWriter(fs, UTF8Encoding.UTF8);  
      66.             byte[] by = MStream.ToArray();  
      67.             for (int i = 0; i < MStream.ToArray().Length; i++)  
      68.                 bw.Write(by[i]);  
      69.             fs.Close();  
      70.         }  
      71.         else  
      72.         {  
      73.             Label1.Text = "该图片已经存在";  
      74.         }  
      75.     }  
      76. }  

    ==================== 迂者 丁小未 CSDN博客专栏=================

    MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

    Unity QQ群:375151422,858550,6348968         cocos2dx QQ群:280818155

    ====================== 相互学习,共同进步 ===================

  • 相关阅读:
    memcache
    memcache 杂记
    mysql_函数
    MySQL_存储过程
    MySQL_视图
    mysql _触发器
    MySQL_优化
    mysql_索引
    R语言编程艺术_第六章_因子和表
    Bioinfo:学习Python,做生信PartII 学习笔记
  • 原文地址:https://www.cnblogs.com/dingxiaowei/p/3645697.html
Copyright © 2011-2022 走看看