现在日常生活中,二维码随处可见,比如支付宝可以生成领赏金的二维码,图书中有直接可以扫描看视频的二维码,那么这些二维码是如何生成的呢?本实例将讲解如何使用C#生成二维码,运行本实例,在生成二维码时,用户可以选择是否需要生成带Logo的二维码。实例运行结果如图37所示。
图37 C#生成二维码
技术要点
本实例实现时,主要用到ZXing.Net组件,该组件是一个第三方组件,它是基于Java的条形码阅读器和生成器库ZXing的一个端口,支持在图像中解码和生成码(如二维码、条形码、PDF 417、EAN、Data Matrix、Codabar等等 ,该组件的开源下载地址为 https://github.com/micjahn/ZXing.Net, 下载完成后解压即可使用,使用ZXing.Net组件的步骤如下
在项目的“解决方案资源管理器”窗口中选中当前项目下的“引用”文件夹,单击右键,在弹出的快捷菜单中选择“添加引用”,然后在弹出的对话框中找到下载路径下的zxing.dll文件,添加到项目中,如图38所示。
图38 添加引用
添加完zxing.dll引用后,切换到代码页面,在命名空间区域添加命名空间后,即可使用该组件中的相应类及方法来生成 者识别码(包括二维码 ,例如,要操作二维码,需要添加如下命名空间
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
using ZXing.QrCode.Internal;
代码实现
(1 新建一个Windows应用程序,默认主窗体为Form1。
(2 在Form1窗体中添加3个TextBox控件、一个RadioButton控件、两个Button控件和两个PictureBox控件,其中,TextBox控件用来设置二维码地址、宽度和高度,RadioButton控件用来设置是否在生成的二维码中包括Logo,Button控件用来选择要包含的Logo图片和生成二维码,PictureBox控件用来显示选择的Logo图片和生成的二维码。
(3 主要程序代码。
/// <summary>
/// 生成二维码图片
/// </summary>
/// <param name="strMessage">要生成二维码的字符串</param>
/// <param name="width">二维码图片宽度(单位 像素 </param>
/// <param name="height">二维码图片高度(单位 像素 </param>
/// <returns></returns>
private Bitmap GetQRCodeByZXingNet(String strMessage, Int32 width, Int32 height)
{
Bitmap result = null;
try
{
BarcodeWriter barCodeWriter = new BarcodeWriter();
barCodeWriter.Format = BarcodeFormat.QR_CODE;
barCodeWriter.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
barCodeWriter.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
barCodeWriter.Options.Height = height;
barCodeWriter.Options.Width = width;
barCodeWriter.Options.Margin = 0;
ZXing.Common.BitMatrix bm = barCodeWriter.Encode(strMessage);
result = barCodeWriter.Write(bm);
}
catch { }
return result;
}
/// <summary>
/// 生成中间带有图片的二维码图片
/// </summary>
/// <param name="contents">要生成二维码包含的信息</param>
/// <param name="middleImg">要生成到二维码中间的图片</param>
/// <param name="width">生成的二维码宽度(单位 像素 </param>
/// <param name="height">生成的二维码高度(单位 像素 </param>
/// <returns>中间带有图片的二维码</returns>
public Bitmap GetQRCodeByZXingNet(string contents, Image middleImg, int width, int height)
{
if (string.IsNullOrEmpty(contents))
{
return null;
}
if (middleImg == null)
{
return GetQRCodeByZXingNet(contents,width,height);
}
//构造二维码写码器
MultiFormatWriter mutiWriter = new MultiFormatWriter();
Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//生成二维码
BitMatrix bm = mutiWriter.encode(contents, BarcodeFormat.QR_CODE, width, height, hint);
BarcodeWriter barcodeWriter = new BarcodeWriter();
Bitmap bitmap = barcodeWriter.Write(bm);
//获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸
int[] rectangle = bm.getEnclosingRectangle();
//计算插入图片的大小和位置
int middleImgW = Math.Min((int)(rectangle[2] 3.5), middleImg.Width);
int middleImgH = Math.Min((int)(rectangle[3] 3.5), middleImg.Height);
int middleImgL = (bitmap.Width middleImgW) 2;
int middleImgT = (bitmap.Height middleImgH) 2;
//将img转换成bmp格式,否则后面无法创建 Graphics对象
Bitmap bmpimg = new Bitmap(bitmap.Width, bitmap.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmpimg))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.DrawImage(bitmap, 0, 0);
}
//在二维码中插入图片
Graphics myGraphic = Graphics.FromImage(bmpimg);
//白底
myGraphic.FillRectangle(Brushes.White, middleImgL, middleImgT, middleImgW, middleImgH);
myGraphic.DrawImage(middleImg, middleImgL, middleImgT, middleImgW, middleImgH);
return bmpimg;
}
更多有价值资源尽在程序开发资源库。
点击“ ”,前往程序开发资源库
Powered by 小羊羔外链网 8.3.7
©2015 - 2024 小羊羔外链网
您的IP:3.234.246.109,2024-03-29 23:04:11,Processed in 0.04753 second(s).