1.下载Qrcode库源码,下载地址:http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library

2.打开源码时,部分类库可能会加载失败,不用理会,只需正常加载 QRCodeLib、QRCodeSampleApp 即可。

3.生成时,会提示编译出错,Error'ThoughtWorks.QRCode.Properties.Resources' does not contain a definition for 'GetResource'。

需修改错误提示的代码行为:

MemoryStream memoryStream = new MemoryStream((byte[])Resources.ResourceManager.GetObject(fileName));

修改支持中文



修改库QRCodeLib中的类QRCodeEncoder.cs

 

    public virtual Bitmap Encode(String content)

    {

      if (QRCodeUtility.IsUniCode(content))

      {

         return Encode(content, Encoding.Unicode);

      }

      else

      {

         return Encode(content, Encoding.ASCII);

      }

    }

为 

public virtual Bitmap Encode(String content)

    {

        if (QRCodeUtility.IsUniCode(content))

{

return Encode(content, Encoding.GetEncoding("gb2312"));

}

else

{

return Encode(content, Encoding.ASCII);

}

    }

对应的,QRCodeDecoder.cs类中的相应代码也要改。这样就中英文支持了。(改为UTF8也可以)

扩展





1、修改 QRCodeEncoder.cs 跟 QRCodeDecoder.cs

      Search一下,將 Encoding.Unicode 替換成 Encoding.UTF8

2、修改 QRCodeUtility.cs

      將 UnicodeEncoding encoding = new UnicodeEncoding();改成 UTF8Encoding encoding = new UTF8Encoding();

      

使用 

QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();

            String encoding = cboEncoding.Text ;

            if (encoding == "Byte") {

                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;

            } else if (encoding == "AlphaNumeric") {

                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;            

            } else if (encoding == "Numeric") {

                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;            

            }

            try {

                int scale = Convert.ToInt16(txtSize.Text);

                qrCodeEncoder.QRCodeScale = scale;

            } catch (Exception ex) {

                MessageBox.Show("Invalid size!");

                return;

            }

            try {

                int version = Convert.ToInt16(cboVersion.Text) ;

                qrCodeEncoder.QRCodeVersion = version;

            } catch (Exception ex) {

                MessageBox.Show("Invalid version !");

            }

            string errorCorrect = cboCorrectionLevel.Text;

            if (errorCorrect == "L")

                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;

            else if (errorCorrect == "M")

                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;

            else if (errorCorrect == "Q")

                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;

            else if (errorCorrect == "H")

                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;

            Image image;

            String data = txtEncodeData.Text;

            image = qrCodeEncoder.Encode(data);                      

            picEncode.Image = image;

            

带图片 

/// <summary>  

      /// 生成二维码.  

      /// </summary>  

      /// <param name="data">需要添加进去的文本</param>  

      /// <returns></returns>  

      public System.Drawing.Image GCode(String data)  

      {  

          QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();  

          qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;  

          qrCodeEncoder.QRCodeScale = 5;  

          qrCodeEncoder.QRCodeVersion = 7;  

   

          qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;  

          var pbImg = qrCodeEncoder.Encode(data, System.Text.Encoding.UTF8);  

         var width = pbImg.Width / 10;  

        var dwidth = width * 2;  

          Bitmap bmp = new Bitmap(pbImg.Width + dwidth, pbImg.Height + dwidth);  

          Graphics g = Graphics.FromImage(bmp);  

          var c = System.Drawing.Color.White;  

          g.FillRectangle(new SolidBrush(c), 0, 0, pbImg.Width + dwidth, pbImg.Height + dwidth);  

          g.DrawImage(pbImg, width, width);  

          g.Dispose();  

         return bmp;  

      }  

   

     /// <summary>  

      /// 调用此函数后使此两种图片合并,类似相册,有个  

    /// 背景图,中间贴自己的目标图片  

     /// </summary>  

      /// <param name="sourceImg">粘贴的源图片</param>  

      /// <param name="destImg">粘贴的目标图片</param>  

      public static System.Drawing.Image CombinImage(System.Drawing.Image imgBack, string destImg)  

      {  

  

          System.Drawing.Image img = System.Drawing.Image.FromFile(destImg);        //照片图片    

          if (img.Height != 50 || img.Width != 50) {  

              img = KiResizeImage(img, 50, 50, 0);  

          }  

          Graphics g = Graphics.FromImage(imgBack);  

   

          g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height);      //g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);   

   

          //g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 - 1, imgBack.Width / 2 - img.Width / 2 - 1,1,1);//相片四周刷一层黑色边框  

   

          //g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);  

   

         g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2 , img.Width, img.Height);  

          GC.Collect();  

          return imgBack;  

      }  

   

      /// <summary>  

      /// Resize图片  

      /// </summary>  

      /// <param name="bmp">原始Bitmap</param>  

      /// <param name="newW">新的宽度</param>  

      /// <param name="newH">新的高度</param>  

      /// <param name="Mode">保留着,暂时未用</param>  

      /// <returns>处理以后的图片</returns>  

      public static System.Drawing.Image KiResizeImage(System.Drawing.Image bmp, int newW, int newH, int Mode)  

      {  

          try 

          {  

              System.Drawing.Image b = new Bitmap(newW, newH);  

              Graphics g = Graphics.FromImage(b);  

   

              // 插值算法的质量  

              g.InterpolationMode = InterpolationMode.HighQualityBicubic;  

   

             g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);  

             g.Dispose();  

   

              return b;  

          }  

         catch 

          {  

              return null;  

      }  

}

参考:http://www.daojia100.com/jingyan/info/51b2def12e05e81a20c042a8.aspx

完整Demo下载:http://download.csdn.net/detail/a497785609/8387311

版权声明:本文为博主原创文章,未经博主允许不得转载。

C# Qrcode生成二维码支持中文,带图片,带文字 2015-01-22 15:11 616人阅读 评论(1) 收藏的更多相关文章

  1. C#Qrcode生成二维码支持中文,带图片,带文字

    C#Qrcode生成二维码支持中文带图片的操作请看二楼的帖子,当然开始需要下载一下C#Qrcode的源码 下载地址 : http://www.codeproject.com/Articles/2057 ...

  2. Qrcode生成二维码支持中文,带图片,带文字

    1.下载Qrcode库源码, 下载地址:http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library2.打开源码时, 部分类 ...

  3. jquery.qrcode生成二维码支持中文

    基本使用方法: 1.首先在页面中加入jquery库文件和qrcode插件. <script type="text/javascript" src="jquery.j ...

  4. 使用jquery-qrcode在页面上生成二维码,支持中文

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 使用jquery.qrcode生成二维码支持logo,和中文

    /* utf.js - UTF-8 <=> UTF-16 convertion * * Copyright (C) 1999 Masanao Izumo <iz@onicos.co. ...

  6. 使用jquery.qrcode生成二维码及常见问题解决方案

    转载文章  使用jquery.qrcode生成二维码及常见问题解决方案 一.jquery.qrcode.js介 jquery.qrcode.js 是一个纯浏览器 生成 QRcode 的 jQuery ...

  7. C# 利用QRCode生成二维码图片

    网上生成二维码的组件是真多,可是真正好用的,并且生成速度很快的没几个,QRCode就是我在众多中找到的,它的生成速度快.但是网上关于它的使用说明,真的太少了,大都是千篇一律的复制粘贴.这是本要用它做了 ...

  8. Qrcode生成二维码的参数总结 及最小尺寸的测试

    Qrcode生成二维码,做过很多实验,探索最小规格的二维码到底是多少尺寸,和最高规格的二维码到底是多大尺寸.现在我总结总结: 有两种思路: 1.生成规格高的二维码,然后压缩到自己想要的尺寸的二维码.这 ...

  9. qrcode 生成二维码

    qrcode 生成二维码 Demo: https://www.hgnulb.cn/freedom/qrcode/qrcode.html qrcodeGithub 地址: https://github. ...

随机推荐

  1. SX学SX内容 笔记?

    某帖子笔记1 主要还是从三体吧某精品贴里看来的... 集合论 集合就是一堆东西...满足 1) 集合中的元素互异(即每种只有一个) 2) 集合中的元素无序(不是一个数组,集合中的元素没有显然的排序法则 ...

  2. mybatis动态SQL - like

    用'%${name}%'可以实现模糊查询,但会放开SQL注入漏洞. <when test="name != null and name!=''"> AND name l ...

  3. Aufs与Devicemapper的关系

    Aufs与Devicemapper的应用 Aufs是Docker最初采用的文件系统,由于Aufs未能加入到Linux内核,考虑到兼容性问题,加入了Devicemapper的支持.目前,除少数版本如Ub ...

  4. http statusCode(状态码)

    转自:1) http://specs.openstack.org/openstack/keystone-specs/api/v3/identity-api-v3.html#unauthorized   ...

  5. pycharm 2016 注册码

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  6. Node.js——Async

    一:流程控制 为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程 ...

  7. jQuery清除文本框,内容并设置不可用

    JQuery清除文本框,内容并设置不可用  如果是设置只读,则将disabled换成readonly function CleanText(textid) { $("#"+text ...

  8. sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,而不是一个函数.    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...

  9. FastReport经验

    FastReport经验 1.FastReport中如果访问报表中的对象? 可以使用FindObject方法. TfrxMemoView(frxReport1.FindObject(’memo1′)) ...

  10. ACM/ICPC 之 "嵌套"队列 -插队(POJ2259)

    这里插队的意思就是排队时遇到熟人则插到其后,否则排到队尾.(这个习惯不太好)(题意) 题目要求我们模拟“插队模型”和队列的入队和出队完成此算法. 由于题目的输入输出很多,此题的查找操作(找到熟人)需要 ...