C#单的二维码生成

最近做一个项目,要用到二维码。在网上也找一些相关的资料,并整理成一功能模块,在这里与大家分享下。若有不对之处,还请提出,并加以改正。谢谢!

在这里的是第三方开源的插件。是谷歌的zxing.dll,在网上也可以自己搜索下载。也可以点击(下载 http://pan.baidu.com/s/1i3IGMih),都可以。

这个类有两个方法,第一个方法只生成二维码( GetCreateQRCodeImg(string strURL, int intQRImgWigthAndHeight, int errorCorrect)),第二个方法生成插图二维码( GetCreateQRCodeInsertSmallImg(string strQRCodeContentURL,string strInsertSmallImgPath,int intQRCodeWidthAndHeigth,int errorCorrection)

); 代码如下

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using com.google.zxing;
  6 using ByteMatrix = com.google.zxing.common.ByteMatrix;
  7 using System.Collections;
  8 using System.Drawing;
  9 using System.IO;
 10 
 11 namespace QRCode
 12 {
 13     public class RQCodeClass
 14     {
 15 
 16         #region -生成二维码-
 17         /// <summary>
 18         /// 生成二维码图片
 19         /// </summary>
 20         /// <param name="strURL">传入内容需要生成的URL地址</param>
 21         /// <param name="intQRImgWigthAndHeight">矩形图片大小(wigth=height)</param>
 22         /// <param name="errorCorrect">容错值 1表示:L;2表示:M;3表示:Q;4表示:H(L--7%,M--15%,Q--25%,H--30%.) </param>
 23         /// <param name="multiFormatWriter">以参数的形式返回一个二维码对象</param>
 24         /// <returns>返回一个对象Bitmap</returns>
 25         private Bitmap GetCreateQRCodeImg(string strURL, int intQRImgWigthAndHeight, int errorCorrect, out MultiFormatWriter multiFormatWriter)
 26         {
 27             //生成二维码
 28             Hashtable hint = new Hashtable();
 29             hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");//添加一个编码
 30             //根据传入的容错值 来进行判断
 31             //L--7%,M--15%,Q--25%,H--30%.
 32             switch (errorCorrect)
 33             {
 34                 case 1://表示 L
 35                     hint.Add(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.L);
 36                     break;
 37                 case 2:
 38                     hint.Add(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.M);
 39                     break;
 40                 case 3:
 41                     hint.Add(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.Q);
 42                     break;
 43                 case 4:
 44                     hint.Add(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);
 45                     break;
 46                 default:
 47                     //没有该容错值
 48                     break;
 49             }
 50 
 51             MultiFormatWriter multiWriter = new MultiFormatWriter();
 52             //要在命名引用空间中 引用 using ByteMatrix=com.google.zxing.common.ByteMatrix;如不添加的话,multiWriter.encode()返回值类型,无法隐式转化。
 53             ByteMatrix bm = multiWriter.encode(strURL, com.google.zxing.BarcodeFormat.QR_CODE, intQRImgWigthAndHeight, intQRImgWigthAndHeight, hint);
 54 
 55             Bitmap img = bm.ToBitmap();//转化为二维码图;
 56             multiFormatWriter = multiWriter;//返回一个二维码对象;out
 57             return img;
 58         } 
 59 
 60          /// <summary>
 61         /// 生成二维码图片
 62         /// </summary>
 63         /// <param name="strURL">传入内容需要生成的URL地址</param>
 64         /// <param name="intQRImgWigthAndHeight">矩形图片大小(wigth=height)</param>
 65         /// <param name="errorCorrect">容错值 1表示:L;2表示:M;3表示:Q;4表示:H(L--7%,M--15%,Q--25%,H--30%.) </param>
 66         /// <param name="multiFormatWriter">以参数的形式返回一个二维码对象</param>
 67         /// <returns>返回一个对象Bitmap</returns>
 68         public Bitmap GetCreateQRCodeImg(string strURL, int intQRImgWigthAndHeight, int errorCorrect)
 69         {
 70             //生成二维码
 71             Hashtable hint = new Hashtable();
 72             hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");//添加一个编码
 73             //根据传入的容错值 来进行判断
 74             //L--7%,M--15%,Q--25%,H--30%.
 75             switch (errorCorrect)
 76             {
 77                 case 1://表示 L
 78                     hint.Add(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.L);
 79                     break;
 80                 case 2:
 81                     hint.Add(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.M);
 82                     break;
 83                 case 3:
 84                     hint.Add(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.Q);
 85                     break;
 86                 case 4:
 87                     hint.Add(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);
 88                     break;
 89                 default:
 90                     //没有该容错值
 91                     break;
 92             }
 93 
 94             MultiFormatWriter multiWriter = new MultiFormatWriter();
 95             //要在命名引用空间中 引用 using ByteMatrix=com.google.zxing.common.ByteMatrix;如不添加的话,multiWriter.encode()返回值类型,无法隐式转化。
 96             ByteMatrix bm = multiWriter.encode(strURL, com.google.zxing.BarcodeFormat.QR_CODE, intQRImgWigthAndHeight, intQRImgWigthAndHeight, hint);
 97 
 98             Bitmap img = bm.ToBitmap();//转化为二维码图;
 99             return img;
100         } 
101         #endregion
102 
103         /// <summary>
104         /// 生成插图的二维码
105         /// </summary>
106         /// <param name="strQRCodeContentURL">需要生成URL的二维码</param>
107         /// <param name="strInsertSmallImgPath">需要插入小图图片的路径</param>
108         /// <param name="intQRCodeWidthAndHeigth">矩正的大小</param>
109         /// <param name="errorCorrection">容错:1 表示:L ;2表示:M ; 3表示:Q;4表示:H (L--7%; M--15%;Q--25%;H--30%)</param>
110         /// <returns></returns>
111         public Bitmap GetCreateQRCodeInsertSmallImg(string strQRCodeContentURL,string strInsertSmallImgPath,int intQRCodeWidthAndHeigth,int errorCorrection) 
112         {
113             MultiFormatWriter multiWrtier = new MultiFormatWriter();//多元框架重写
114     
115             Bitmap bitmap=  GetCreateQRCodeImg(strQRCodeContentURL,intQRCodeWidthAndHeigth,errorCorrection,out multiWrtier);//生成二维码
116             Bitmap bitmapInsertImg=  GetCreateInsertSmallImg(bitmap,multiWrtier,strInsertSmallImgPath,strQRCodeContentURL,intQRCodeWidthAndHeigth);//生成插图二维码
117             //资源的释放
118             bitmap.Dispose();
119             return bitmapInsertImg;
120         }
121          
122         /// 生成插图的二维码方法
123         /// </summary>
124         /// <param name="bitQRImg">二维码图片对象</param>
125         /// <param name="multiWriter">多元框架读取</param>
126         /// <param name="strInsertImgPath">插入图片的路径</param>
127         /// <param name="strURL">需要生成二维码URL的内容</param>
128         /// <param name="scale">比例大小</param>
129         /// <param name="savePath">生成插图的二维码</param>
130         private Bitmap GetCreateInsertSmallImg(Bitmap bitQRImg, MultiFormatWriter multiWriter, string strInsertImgPath, string strURL, int scale)
131         {
132             //读取需要小图的物理路径
133             string Path = strInsertImgPath;
134             FileStream _fs = new FileStream(Path, FileMode.Open);//打开数据流
135             var middleImg = System.Drawing.Image.FromStream(_fs, true);//读取
136 
137             //计算插入图片的大小和位置
138             //取二维码实际尺寸(去掉二维码两边空白处的实际尺寸)
139             System.Drawing.Size rederSize = multiWriter.GetEncodeSize(strURL, com.google.zxing.BarcodeFormat.QR_CODE, scale, scale);
140             int middleImgW = Math.Min((int)(rederSize.Width / 3.5), middleImg.Width);
141             int middleImgH = Math.Min((int)(rederSize.Height / 3.5), middleImg.Height);
142 
143             int middleImgL = (bitQRImg.Width - middleImgW) / 2;
144             int middleImgT = (bitQRImg.Height - middleImgH) / 2;
145             //将img 转化为bmp 格式,否则无创建Graphic
146             Bitmap bitMap = new Bitmap(bitQRImg.Width, bitQRImg.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
147             using (Graphics g = Graphics.FromImage(bitMap))
148             {
149                 //并联插图片模式
150                 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
151                 //呈现质量
152                 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
153                 //合成图像质量
154                 g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
155                 g.DrawImage(bitQRImg, 0, 0);//绘图
156             }
157             //在二维码中插入图片
158             System.Drawing.Graphics myGraphics = Graphics.FromImage(bitMap);
159 
160             //填充一个矩形
161             myGraphics.FillRectangle(Brushes.White, middleImgL, middleImgT, middleImgW, middleImgH);
162             myGraphics.DrawImage(middleImg, middleImgL, middleImgT, middleImgW, middleImgH);
163 
164             //资源释放
165             middleImg.Dispose();
166             myGraphics.Dispose();
167             return bitMap;
168         }
169     }
170 }

在这里调用就可以啊。

 1  //生成二维码 
 2             RQCodeClass rqClass = new RQCodeClass();
 3           
 4             Bitmap bitmap =  rqClass.GetCreateQRCodeImg("http://www.baidu.com",700,3);
 5             bitmap.Save(HttpRuntime.BinDirectory+"ggg.jpg");
 6             string strPath = HttpContext.Current.Server.MapPath("main_2.jpg");
 7             Bitmap insertImg= rqClass.GetCreateQRCodeInsertSmallImg("http://www.baidu.com",strPath,700,3);
 8             insertImg.Save(HttpRuntime.BinDirectory+"uu.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
 9 
10             bitmap.Dispose();
11             insertImg.Dispose();