最近做一个项目,要用到二维码。在网上也找一些相关的资料,并整理成一功能模块,在这里与大家分享下。若有不对之处,还请提出,并加以改正。谢谢!
在这里的是第三方开源的插件。是谷歌的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();