标签:target coder lan round 开始 text load document eal
这里需要引用一个库
下载地址:点击查看
引用到我们的项目,然后双击打开对象浏览器
这两个类是主要的。字面意思就很好区别了,一个是把信息生成二维码,一个是把二维码转成信息。
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(); } }
标签:target coder lan round 开始 text load document eal
原文地址:http://www.cnblogs.com/Sea1ee/p/7250130.html