http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 48581|回复: 22
打印 上一主题 下一主题

[C#语言基础] C#Qrcode生成二维码支持中文,带图片,带文字

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-18 13:39:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
               C#Qrcode生成二维码支持中文
带图片的操作请看二楼的帖子
当然开始需要下载一下C#Qrcode的源码 下载地址 : http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library
直接下载
QRCode.zip (2.35 MB, 下载次数: 989)
然后需要修改一些代码用于支持中文
修改代码的时候会遇到可能遇到的问题
问题一(这个问题我遇到了):
调试Winform平台的例子时出现如下提 示:
  1. Error'ThoughtWorks.QRCode.Properties.Resources' does not contain a definition for 'GetResource'。
复制代码
只要把这些出错的地方改成:
[C#] 纯文本查看 复制代码
MemoryStream memoryStream = new MemoryStream((byte[])Resources.ResourceManager.GetObject(fileName));

  就可以了。
问题二:
调试WM版的示例程序在Encode时,出现IndexOutOfRangeException in rsTemp 的超出索引最大值异常,它在rsTemp[rsBlockNumber][j] = codewords[i2];这里抛出异常~
  
    原本我以为是程序逻辑出错,后来经过对比桌面版和WM版的类库,发现没有错啊,然后终于找到一个比较“笨”的解决方案:如下:
  我注意到,在QRCodeMobileLib项目下的QRCodeEncoder.cs类中,定义了个:
  [code=csharp]internal static String DATA_PATH = "qrcode_data";[/code]
  此行代码在桌面版被注释掉了,我猜是不是要把资源文件拷贝到WM程序的这个目录下呢?好吧,于是动手,在QRCodeWindowsMobile5项目下建立一个新文件夹,名字是qrcode_data,然后再拷贝那些资源文件到此目录。
  然后设置这些资源文件的生成动作为(复制,内容)好了,然后再重新调试一下,Encode~通过!
修改支持中文:
修改库QRCodeLib中的类QRCodeEncoder.cs
   
[C#] 纯文本查看 复制代码
 public virtual Bitmap Encode(String content)
    {
    if (QRCodeUtility.IsUniCode(content))
    {
    return Encode(content, Encoding.Unicode);
    }
    else
    {
    return Encode(content, Encoding.ASCII);
    }
    } 


   
[C#] 纯文本查看 复制代码
public virtual Bitmap Encode(String content)
    {
    if (QRCodeUtility.IsUniCode(content))
    {
    return Encode(content, Encoding.GetEncoding("gb2312"));
    }
    else
    {
    return Encode(content, Encoding.ASCII);
    }
    } 

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

扩展
  1.修改 QRCodeEncoder.cs 跟 QRCodeDecoder.cs
  Search一下,將 Encoding.Unicode 替換成 Encoding.UTF8
  
  2.修改 QRCodeUtility.cs
  
[C#] 纯文本查看 复制代码
將 UnicodeEncoding encoding = new UnicodeEncoding();
改成 UTF8Encoding encoding = new UTF8Encoding();

相关使用代码如下
[C#] 纯文本查看 复制代码
 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;


本帖被以下淘专辑推荐:



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
沙发
 楼主| 发表于 2013-3-18 13:48:03 | 只看该作者
下面是带图片的方式
[C#] 纯文本查看 复制代码
/// <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;  
      }  
}

带图片的方法
板凳
发表于 2013-3-18 14:32:03 | 只看该作者
不错不错,学习了
地板
发表于 2013-5-3 01:08:43 | 只看该作者
写的很好,上面的代码我测试过了,可以生成内嵌有图片的二维码,但是,我将二维码解密后,原来的数据信息有一部分出现了乱码,可能是里面小图片所占区域的数据信息被破坏了吧,但怎样才能解密出正解的原始数据呢??
5
 楼主| 发表于 2013-5-3 08:01:39 | 只看该作者
312899liliuzhu 发表于 2013-5-3 01:08
写的很好,上面的代码我测试过了,可以生成内嵌有图片的二维码,但是,我将二维码解密后,原来的数据信息有 ...

安说和这个无关吧。应该还是编码的问题,你修改下编码试试
6
发表于 2013-5-3 14:05:37 | 只看该作者

  g.InterpolationMode = InterpolationMode.HighQualityBicubic;  
这一句是什么意思,我就把这句注释掉了,解密后只有中间一部份字符乱码,前面的,和后面的都正常
你的上面代码你自己测试过了没(解密)??
  
7
发表于 2013-5-3 14:06:36 | 只看该作者

  g.InterpolationMode = InterpolationMode.HighQualityBicubic;  
这一句是什么意思,我就把这句注释掉了,解密后只有中间一部份字符乱码,前面的,和后面的都正常
你的上面代码你自己测试过了没(解密)??
  
8
 楼主| 发表于 2013-5-3 14:14:50 | 只看该作者
312899liliuzhu 发表于 2013-5-3 14:06
g.InterpolationMode = InterpolationMode.HighQualityBicubic;  
这一句是什么意思,我就把这句注释掉 ...

我肯定测试过啊,你注释了干什么,如果真不行,你再找找别的解决方法吧。我只会这么多。
9
发表于 2013-5-3 14:24:37 | 只看该作者
InterpolationMode 的命名空间是啥,我的这一句报错,没引用命名空间!
10
 楼主| 发表于 2013-5-3 14:37:14 | 只看该作者
312899liliuzhu 发表于 2013-5-3 14:24
InterpolationMode 的命名空间是啥,我的这一句报错,没引用命名空间!

using System.Drawing.Drawing2D;
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-27 19:02

© 2014-2021

快速回复 返回顶部 返回列表