二维码与条形码的生成
引用命名空间
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
using ZXing.QrCode.Internal;
在设计的窗体项目中引入zxing.dll,zxing.presentation.dll两个库文件,
纯二维码的生成
public static Bitmap GenerateQRCode(string _text, int _width, int _height)
{
BarcodeWriter writer = new BarcodeWriter();
writer.Format = BarcodeFormat.QR_CODE;
QrCodeEncodingOptions options = new QrCodeEncodingOptions()
{
DisableECI = true, //设置内容编码
CharacterSet = "UTF-8", //设置二维码的宽度和高度
Width = _width,
Height = _height,
Margin = 1 //设置二维码的边距,单位不是固定像素
};
writer.Options = options;
Bitmap map = writer.Write(_text);
return map;
}
带有中心图片的二维码生成
public static Bitmap GenerateLogoQRCode(string _text, int _width, int _height)
{
//Logo 图片
string logo_path = System.AppDomain.CurrentDomain.BaseDirectory + @"\img\logo.png";
Bitmap logo = new Bitmap(logo_path);
//构造二维码写码器
MultiFormatWriter writer = new MultiFormatWriter();
Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//hint.Add(EncodeHintType.MARGIN, 2);//旧版本不起作用,需要手动去除白边
//生成二维码
BitMatrix bm = writer.encode(_text, BarcodeFormat.QR_CODE, _width + 30, _height + 30, hint);
bm = DeleteWhiteForQRCode(bm);
BarcodeWriter barcode_writer = new BarcodeWriter();
Bitmap map = barcode_writer.Write(bm);
//获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
int[] rectangle = bm.getEnclosingRectangle();
//计算插入图片的大小和位置
int middleW = Math.Min((int)(rectangle[2] / 3), logo.Width);
int middleH = Math.Min((int)(rectangle[3] / 3), logo.Height);
int middleL = (map.Width - middleW) / 2;
int middleT = (map.Height - middleH) / 2;
Bitmap bmpimg = new Bitmap(map.Width, map.Height, 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(map, 0, 0, _width, _height);
//白底将二维码插入图片
g.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH);
g.DrawImage(logo, middleL, middleT, middleW, middleH);
}
return bmpimg;
}
条形码生成
public static Bitmap GenerateBarCode(string _text, int _width, int _height)
{
BarcodeWriter writer = new BarcodeWriter();
//使用ITF 格式,不能被现在常用的支付宝、微信扫出来
//如果想生成可识别的可以使用 CODE_128 格式
//writer.Format = BarcodeFormat.ITF;
//writer.Format = BarcodeFormat.CODE_39;
writer.Format = BarcodeFormat.CODE_128;
//writer.Format = BarcodeFormat.CODE_93;
//writer.Format = BarcodeFormat.CODABAR;
//writer.Format = BarcodeFormat.;
EncodingOptions options = new EncodingOptions()
{
Width = _width,
Height = _height,
PureBarcode = true,
Margin = 2
};
writer.Options = options;
Bitmap map = writer.Write(_text);
return map;
}
删除默认对应的空白
private static BitMatrix DeleteWhiteForQRCode(BitMatrix _matrix)
{
int[] rec = _matrix.getEnclosingRectangle();
int res_width = rec[2] + 1;
int res_height = rec[3] + 1;
BitMatrix res_matrix = new BitMatrix(res_width, res_height);
res_matrix.clear();
for (int i = 0; i < res_width; i++)
{
for (int j = 0; j < res_height; j++)
{
if (_matrix[i + rec[0], j + rec[1]])
res_matrix[i, j] = true;
}
}
return res_matrix;
}
建议条形码和二维码生成在指定的PictureBox控件中,将来处理起来会非常方便,PictureBox控件的SizeMode属性设置为StretchImage,图形自动填充到控件中
QRCodePictureBox.Image = BarcodeHelper.GenerateQRCode(qr_content_str, 94, 94); 将二维码生成在定义的PictureBox中,其中二维码与PictureBox贴合的尺寸需要自行调整;
BarCodePictureBox.Image = BarcodeHelper.GenerateBarCode(_product_print_infor.MacAddress, 90, 17 * 6); 将条形码生成在定义好的PictureBox中,其中条形码与PictureBox贴合的尺寸需要自行调整;
本文操作为下来的标签机打印做准备,请关注另外的文章如何实现高清打印操作