- 二维码
1.什么是二维码?
二维条形码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点
2.分类
1).堆叠式
堆叠式/行排式二维条码(又称堆积式二维条码或层排式二维条码),其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code
16K、Code 49、PDF417等。
2).矩阵式
短阵式二维条码(又称棋盘式二维条码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code
One、Maxi Code、QR Code、 Data Matrix等
3.应用
二维条码具有储存量大、保密性高、追踪性高、抗损性强、备援性大、成本便宜等特性,这些特性特别适用于表单、安全保密、追踪、证照、存货盘点、资料备援等方面。
URL)就是为了让一个很长的网站链接缩短为一个短的链接,因为微博内有字数限制,所以短地址就是为了这个而产生的。现在大部分微博、 手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场。估计很多朋友现在也正在使用
2.算法一
3.算法二
public static string getShortUrl(string Data, QrType qrType, string QrHost) { string UrlData = string.Empty; try { string[] ActStr = { "getUrl", "getMeVcard", "getText" }; QrHost = (QrHost.LastIndexOf(@"/")+1 == QrHost.Length) ? QrHost : (string.Format("{0}{1}", QrHost, "/")); UrlData = getEncryptData(Data); UrlData = UrlHelper.GetShortUrl(string.Format("{0}Qr/{1}?Content={2}", QrHost, ActStr[(int)qrType], UrlData)); UrlData = string.Format("{0}{1}", QrHost, UrlData); } catch (Exception e) { UrlData = string.IsNullOrEmpty(QrHost)?"请配置QrHost":e.Message; } return UrlData; }
2.生成二维码图片的MemoryStream
/// <summary> /// MeVcard名片二维码 /// </summary> /// <param name="Info">MeVcard</param> /// <returns></returns> public MemoryStream CreateMeVcard(MeVcardInfo Info) { if (Info == null ) return null; Content = "MECARD:"; SpVcardLink("N", Info.Name); SpVcardLink("TEL", Info.Tel); SpVcardLink("TEL", Info.Tel2); SpVcardLink("EMAIL", Info.Email); SpVcardLink("ADR", Info.Address); SpVcardLink("URL", Info.Url); SpVcardLink("NOTE", Info.Note); SpVcardLink("BDAY", Info.Birthday); SpVcardLink("PHONE", Info.Phone); SpVcardLink("FAX", Info.FAX); Content = (Content == "MECARD:" ? "" : Content); return CreateText(Content); }
3.解析短URL,还原实际地址
public void Index(string url) {try { if (url.Length == 6) { string Locahost = Request.Url.AbsoluteUri.Replace(url, ""); using (var client = YIZNoSql.RedisManager.GetPConClient()) { url = client.Get<string>(url); } string Content = string.Empty; Action<string> Act = getText; string Acttext = string.Format("{0}qr/{1}?content=", Locahost, "gettext"); string Acturl = string.Format("{0}qr/{1}?content=", Locahost, "geturl"); string Actmevcard = string.Format("{0}qr/{1}?content=", Locahost, "getmevcard"); if (url.IndexOf(Acturl, StringComparison.CurrentCultureIgnoreCase) == 0) { Content = url.Substring(Acturl.Length, url.Length - Acturl.Length); Act = getUrl; } else if (url.IndexOf(Actmevcard, StringComparison.CurrentCultureIgnoreCase) == 0) { Content = url.Substring(Actmevcard.Length, url.Length - Actmevcard.Length); Act = getMeVcard; } else { Content = url.Substring(Acttext.Length, url.Length - Acttext.Length); Act = getText; } Act(Content); } else { Response.Write("Error!!"); } } catch { Response.Write("Parse Error!!"); } }
4.输出图片
/// <summary> /// 二维码名片 /// </summary> private void getMeVcard(string Content) { QrCodeHelper qc = new QrCodeHelper(); MeVcardInfo Info = JsonConvert.DeserializeObject<MeVcardInfo>(Helper.getDecryptData(Content)); MemoryStream ms = qc.CreateMeVcard(Info); WriteImg(ms); } private void WriteImg(MemoryStream Ms) { try { Response.Clear(); Response.ContentType = "image/png"; Response.OutputStream.Write(Ms.GetBuffer(), 0, (int)Ms.Length); } catch { } }