C#生成二维码的常用方法-附源码

C#生成二维码的常用方法-附源码

二维码基础知识
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
网上用的最多的是ThoughtWorks.QRCode和QrCode.Net两种方式。访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,ThoughtWorks.QRCode的功能更多一些,但是dll文件有6兆,QrCode.Net只有400多K,大家根据自己的需要选择吧。附上代码仅供参考。

ThoughtWorks.QRCode:

using System;
using System.Drawing;
using System.Text;
using ThoughtWorks.QRCode.Codec;
 
namespace ConsoleTest
{
    public class Test
    {
        #region 生成二维码
        /// <summary>
        /// 生成二维码
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        private static string QRCode()
        {
            System.Drawing.Bitmap bt;
            string enCodeString = "http://www.woaidaogu.com";
 
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
            qrCodeEncoder.QRCodeScale = 4;//大小(值越大生成的二维码图片像素越高)
            qrCodeEncoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误效验、错误更正(有4个等级)
            qrCodeEncoder.QRCodeBackgroundColor = Color.Yellow;//背景色
            qrCodeEncoder.QRCodeForegroundColor = Color.Green;//前景色
 
            bt = qrCodeEncoder.Encode(enCodeString, Encoding.UTF8);
 
            string filename = "code";
            string file_path = AppDomain.CurrentDomain.BaseDirectory + "QRCode\\";
            string codeUrl = file_path + filename + ".jpg";
 
            //根据文件名称,自动建立对应目录
            if (!System.IO.Directory.Exists(file_path))
                System.IO.Directory.CreateDirectory(file_path);
 
            bt.Save(codeUrl);//保存图片
            return codeUrl;
        }
        #endregion
    }
}

QrCode.Net:

protected void Button1_Click(object sender, EventArgs e)

    {

      using (var ms = new MemoryStream())

      {
        string stringtest = "http://www.woaidaogu.com";

        GetQRCode(stringtest, ms);

        Response.ContentType = "image/Png";

        Response.OutputStream.Write(ms.GetBuffer(), 0, (int)ms.Length);

        Image img = Image.FromStream(ms);

        string filename = DateTime.Now.ToString("yyyymmddhhmmss");

        string path = Server.MapPath("~/image/") + filename + ".png";

        img.Save(path);

        Response.End();

      } 
    }

    /// <summary>

    /// 获取二维码

    /// </summary>

    /// <param name="strContent">待编码的字符</param>

    /// <param name="ms">输出流</param>

    ///<returns>True if the encoding succeeded, false if the content is empty or too large to fit in a QR code</returns>

    public static bool GetQRCode(string strContent, MemoryStream ms)
    {
      ErrorCorrectionLevel Ecl = ErrorCorrectionLevel.M; //误差校正水平 
      string Content = strContent;//待编码内容
      QuietZoneModules QuietZones = QuietZoneModules.Two; //空白区域 
      int ModuleSize = 12;//大小
      var encoder = new QrEncoder(Ecl);
      QrCode qr;
      if (encoder.TryEncode(Content, out qr))//对内容进行编码,并保存生成的矩阵
      {
        var render = new GraphicsRenderer(new FixedModuleSize(ModuleSize, QuietZones));
        render.WriteToStream(qr.Matrix, ImageFormat.Png, ms);
      }
      else
      {
        return false;
      }
      return true;
    }

参考文献:我爱捣鼓 http://www.woaidaogu.com
这就是我们经常用到的C#生成二维码的方法,使用ThoughtWorks.QRCode和QrCode.Net两个组件,希望对大家有所帮助!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QRCode二维码维码支持中文,网上流传很多版本都说支持中文二维码。看过测试都有问题,自己看了源码改了下。 原版本 中有 IsUnicode 方法判断是否为Unicode编码 但这个方法好像有问题 所以无法准确判断中文。可以通过改写这个来实现中文。 另外有两个方法 都可以解决中文问题 public virtual String decode(QRCodeImage qrCodeImage, Encoding encoding) public virtual String decode(QRCodeImage qrCodeImage) 因为是虚方法可以重写这个方法就可以 所以 可以通过 改写IsUnicode 和 重写 这个两个虚方法来实现 /// /// 用于判断中文 /// /// /// public static bool IsUnicode(byte[] byteData) { // This is by Joson Jiang 用于判断中文 //因为ascii编码当中的最大为127,这样判断后, //就能正确的判断是不是unicode,这样就能正确的解码中文了. bool isUnicode = false; try { foreach (byte value in byteData) { if (value > 128) { isUnicode = true; break; } } } catch (Exception) { //其中的是原本的代码 无法正确判断 中文 string value1 = FromASCIIByteArray(byteData); string value2 = FromUnicodeByteArray(byteData); byte[] ascii = AsciiStringToByteArray(value1); byte[] unicode = UnicodeStringToByteArray(value2); if (ascii[0] != unicode[0]) return true; return false; } return isUnicode;//返回是不是Unicode编码 } /// /// 重写直接返回 解决中文问题 /// public class QRCodeDecoders : QRCodeDecoder { QRCodeDecoder decoder = new QRCodeDecoder(); public override String decode(QRCodeImage qrCodeImage) { sbyte[] data = decoder.decodeBytes(qrCodeImage); byte[] byteData = new byte[data.Length]; Buffer.BlockCopy(data, 0, byteData, 0, byteData.Length); String decodedData; return decodedData = ThoughtWorks.QRCode.Codec.Util.QRCodeUtility.FromUnicodeByteArray(byteData); } } 忘了说这个是 vs2010的 原版本是 vs2005
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值