C# WinForm项目实战:用ZXing.Net给商品管理系统加上条码/二维码生成功能(附完整源码)

张开发
2026/4/16 21:15:32 15 分钟阅读

分享文章

C# WinForm项目实战:用ZXing.Net给商品管理系统加上条码/二维码生成功能(附完整源码)
C# WinForm实战用ZXing.Net打造企业级条码/二维码生成系统在零售、仓储和会员管理等业务场景中条码和二维码已经成为商品流通和数据交互的数字身份证。作为WinForm开发者我们经常需要为管理系统添加这类功能。本文将带你从零开始基于ZXing.Net库构建一个完整的条码/二维码生成模块涵盖从基础生成到企业级功能集成的全流程。1. 环境准备与基础架构在开始编码前我们需要搭建合适的基础环境。ZXing.Net是.NET平台下最成熟的条码处理库之一支持生成和解析多种一维码和二维码格式。首先通过NuGet安装ZXing.Net库Install-Package ZXing.Net -Version 0.16.8基础架构设计需要考虑以下关键点模块化设计将条码生成、解析功能封装为独立服务类异常处理对输入数据有效性进行检查性能优化高频调用场景下的对象复用扩展性预留接口支持未来可能新增的条码类型建议创建如下基础类结构BarcodeService ├── GenerateBarcode() ├── GenerateQRCode() ├── GenerateQRCodeWithLogo() └── DecodeBarcode()2. 核心生成功能实现2.1 一维码生成实战一维码如CODE 128常用于商品编码以下是经过生产环境验证的优化代码public Bitmap GenerateBarcode(string content, int width 300, int height 100, bool showText false) { if (string.IsNullOrWhiteSpace(content)) throw new ArgumentException(内容不能为空); var writer new BarcodeWriter { Format BarcodeFormat.CODE_128, Options new EncodingOptions { Width width, Height height, Margin 1, PureBarcode !showText } }; return writer.Write(content); }关键参数说明参数类型说明推荐值widthint条码宽度(像素)200-400heightint条码高度(像素)50-150Marginint边距(像素)1-2PureBarcodebool是否显示下方文本根据需求2.2 二维码生成进阶技巧标准二维码生成基础上我们增加错误校正级别控制public Bitmap GenerateQRCode(string content, int size 300, ErrorCorrectionLevel level ErrorCorrectionLevel.H) { var writer new BarcodeWriter { Format BarcodeFormat.QR_CODE, Options new QrCodeEncodingOptions { Width size, Height size, Margin 1, CharacterSet UTF-8, ErrorCorrection level } }; return writer.Write(content); }错误校正级别对照表级别容错率适用场景L~7%内容较少时M~15%一般使用Q~25%带Logo时H~30%重要数据3. 企业级功能增强3.1 带Logo的二维码专业实现品牌二维码需要特别处理Logo融合以下是经过优化的实现public Bitmap GenerateQRCodeWithLogo(string content, Image logo, int size 300) { // 生成基础二维码 var qrCode GenerateQRCode(content, size); // 计算Logo合适尺寸 (不超过二维码的1/5) int logoMaxSize size / 5; int logoWidth Math.Min(logo.Width, logoMaxSize); int logoHeight Math.Min(logo.Height, logoMaxSize); // 创建画布 Bitmap canvas new Bitmap(size, size); using (Graphics g Graphics.FromImage(canvas)) { g.DrawImage(qrCode, 0, 0); // 在中心位置绘制Logo int x (size - logoWidth) / 2; int y (size - logoHeight) / 2; // 添加白色背景避免干扰 g.FillRectangle(Brushes.White, x, y, logoWidth, logoHeight); g.DrawImage(logo, x, y, logoWidth, logoHeight); } return canvas; }3.2 批量生成与打印功能商品管理系统常需要批量生成条码这里封装一个高效的方法public ListBitmap BatchGenerateBarcodes(Liststring contents, BarcodeFormat format) { var writer new BarcodeWriter { Format format }; var options new EncodingOptions { Width 200, Height 80 }; return contents.AsParallel() .Select(c { writer.Options options; return writer.Write(c); }) .ToList(); }打印功能集成示例private void PrintBarcode(Bitmap barcode) { PrintDocument pd new PrintDocument(); pd.PrintPage (sender, e) { e.Graphics.DrawImage(barcode, 50, 50); }; PrintDialog dialog new PrintDialog(); dialog.Document pd; if (dialog.ShowDialog() DialogResult.OK) { pd.Print(); } }4. 完整业务场景实现4.1 WinForm界面集成方案设计一个实用的条码生成界面应包含以下元素输入区域文本框用于输入条码内容配置选项条码类型选择一维码/二维码尺寸调节滑块错误校正级别选择预览区域PictureBox控件显示生成的条码操作按钮生成、保存、打印、解析关键事件处理代码private void btnGenerate_Click(object sender, EventArgs e) { try { if (rbBarcode.Checked) { var barcode _service.GenerateBarcode(txtContent.Text); picBarcode.Image barcode; } else { Image logo chkIncludeLogo.Checked ? Properties.Resources.CompanyLogo : null; var qrCode logo null ? _service.GenerateQRCode(txtContent.Text) : _service.GenerateQRCodeWithLogo(txtContent.Text, logo); picBarcode.Image qrCode; } } catch (Exception ex) { MessageBox.Show($生成失败: {ex.Message}); } }4.2 数据库集成与DataGridView绑定在商品管理系统中通常需要将条码与商品信息关联存储public void SaveProductWithBarcode(Product product) { // 生成条码图片 var barcode _service.GenerateBarcode(product.SKU); // 转换为字节数组存储 using (var ms new MemoryStream()) { barcode.Save(ms, ImageFormat.Png); product.BarcodeImage ms.ToArray(); } // 保存到数据库 _repository.AddProduct(product); }DataGridView中显示条码的实现private void BindProducts() { var products _repository.GetProducts(); dataGridView1.DataSource products; // 添加图片列 DataGridViewImageColumn imgCol new DataGridViewImageColumn(); imgCol.HeaderText 条码; imgCol.ImageLayout DataGridViewImageCellLayout.Zoom; dataGridView1.Columns.Add(imgCol); // 转换字节数组为Image foreach (DataGridViewRow row in dataGridView1.Rows) { var product (Product)row.DataBoundItem; if (product.BarcodeImage ! null) { using (var ms new MemoryStream(product.BarcodeImage)) { row.Cells[BarcodeImage].Value Image.FromStream(ms); } } } }5. 性能优化与异常处理5.1 对象复用与资源管理高频生成场景下应重用BarcodeWriter实例private readonly BarcodeWriter _barcodeWriter; private readonly BarcodeWriter _qrCodeWriter; public BarcodeService() { _barcodeWriter new BarcodeWriter { Format BarcodeFormat.CODE_128, Options new EncodingOptions { Width 300, Height 100 } }; _qrCodeWriter new BarcodeWriter { Format BarcodeFormat.QR_CODE, Options new QrCodeEncodingOptions { Width 300, Height 300, ErrorCorrection ErrorCorrectionLevel.H } }; }5.2 完善的异常处理策略条码生成可能遇到的典型问题及解决方案内容过长if (content.Length 80) { throw new ArgumentException(一维码内容长度不能超过80个字符); }无效字符if (format BarcodeFormat.CODE_128 !Regex.IsMatch(content, ^[A-Za-z0-9\-\.\ \$\/\\%]$)) { throw new ArgumentException(CODE 128格式只支持字母数字和特定符号); }图像处理异常try { // 图像操作代码 } catch (OutOfMemoryException) { // 处理大图像内存问题 } catch (ArgumentException ex) when (ex.ParamName stream) { // 处理无效图像流 }6. 扩展功能与实用技巧6.1 条码解析功能实现完整的业务系统还需要条码解析能力public string DecodeBarcode(Bitmap barcodeImage) { var reader new BarcodeReader { Options new DecodingOptions { PossibleFormats new ListBarcodeFormat { BarcodeFormat.CODE_128, BarcodeFormat.QR_CODE }, TryHarder true } }; var result reader.Decode(barcodeImage); return result?.Text ?? 无法识别的条码; }6.2 实用工具方法图片保存优化public void SaveBarcodeImage(Bitmap image, string defaultFileName 条码) { using (SaveFileDialog dialog new SaveFileDialog()) { dialog.Filter PNG 图片|*.png|JPEG 图片|*.jpg; dialog.FileName defaultFileName; if (dialog.ShowDialog() DialogResult.OK) { var format Path.GetExtension(dialog.FileName).ToLower() .jpg ? ImageFormat.Jpeg : ImageFormat.Png; image.Save(dialog.FileName, format); } } }Base64转换用于Web API交互public string ImageToBase64(Bitmap image) { using (var ms new MemoryStream()) { image.Save(ms, ImageFormat.Png); return Convert.ToBase64String(ms.ToArray()); } } public Bitmap Base64ToImage(string base64String) { var bytes Convert.FromBase64String(base64String); using (var ms new MemoryStream(bytes)) { return new Bitmap(ms); } }图片清晰度优化public static Bitmap EnhanceImageQuality(Bitmap original) { Bitmap enhanced new Bitmap(original.Width * 2, original.Height * 2); using (Graphics g Graphics.FromImage(enhanced)) { g.InterpolationMode InterpolationMode.HighQualityBicubic; g.DrawImage(original, 0, 0, enhanced.Width, enhanced.Height); } return enhanced; }

更多文章