在开发过程中,我们常常需要生成条码(如一维码或二维码)以满足各种业务需求。例如,物流系统中的包裹追踪、零售系统中的商品编码等。今天,我们将通过 C#和 SkiaSharp 库,展示如何生成一维码,并将其转换为 Base64 字符串,以便在 Web 页面或其他需要显示图像的场景中使用。
一、背景介绍
条码是一种通过光学扫描设备读取的编码方式,广泛应用于物流、零售、医疗等行业。一维码(如 Code 128、Code 39 等)是最常见的条码类型之一,因其结构简单、易于生成和扫描而被广泛使用。
在 C#中,我们可以使用BarcodeLib
库生成一维码,但该库不支持直接在条码下方添加文本。为了实现这一功能,我们将结合SkiaSharp
库,用于绘制条码和文本。
二、环境准备
在开始之前,请确保你的项目中安装了以下 NuGet 包:
- BarcodeLib:用于生成一维码。
- SkiaSharp:用于绘制条码和文本。
你可以通过 NuGet 包管理器安装这些包:
Install-Package BarcodeLib
Install-Package SkiaSharp
三、代码实现
以下是完整的代码示例,展示如何生成一维码并在其下方显示数字,最终将结果转换为 Base64 字符串。
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using BarcodeLib;
using SkiaSharp;
class Program
{
static void Main()
{
// 条码内容
string barcodeValue = "123456789";
// 使用 BarcodeLib 生成一维码
Barcode barcode = new Barcode();
barcode.IncludeLabel = false; // 不包含内置标签
Image barcodeImage = barcode.Encode(BarcodeLib.TYPE.CODE128, barcodeValue, Color.Black, Color.White, 400, 100);
// 将 System.Drawing.Image 转换为 SkiaSharp 的 SKBitmap
SKBitmap skBitmap = SKBitmap.FromImage(SKImage.FromEncodedData(barcodeImage.ToBase64String(ImageFormat.Png)));
// 创建一个更大的画布,用于绘制条码和数字
using (var surface = SKSurface.Create(new SKImageInfo(skBitmap.Width, skBitmap.Height + 50)))
using (var canvas = surface.Canvas)
{
// 绘制条码
canvas.DrawBitmap(skBitmap, 0, 0);
// 绘制数字
using (var paint = new SKPaint())
{
paint.Color = SKColors.Black;
paint.TextSize = 24; // 设置字体大小
paint.IsAntialias = true; // 抗锯齿
// 计算文本位置(水平居中)
SKRect textBounds = new SKRect();
paint.MeasureText(barcodeValue, ref textBounds);
float x = (skBitmap.Width - textBounds.Width) / 2;
float y = skBitmap.Height + 35; // 距离条码底部的距离
// 绘制文本
canvas.DrawText(barcodeValue, x, y, paint);
}
// 将最终图像转换为Base64字符串
using (var image = surface.Snapshot())
using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
using (var ms = new MemoryStream())
{
data.SaveTo(ms);
byte[] imageBytes = ms.ToArray();
string base64String = Convert.ToBase64String(imageBytes);
// 输出Base64字符串
Console.WriteLine("Base64字符串:");
Console.WriteLine(base64String);
}
}
}
}
四、代码说明
- 生成条码:
- 使用
BarcodeLib
生成一维码。 - 将生成的
System.Drawing.Image
转换为 SkiaSharp 的SKBitmap
。 - 绘制条码和数字:
- 创建一个更大的
SKSurface
,用于绘制条码和数字。 - 使用
SKCanvas
绘制条码。 - 使用
SKPaint
绘制数字,水平居中显示在条码下方。 - 转换为 Base64 字符串:
- 将最终的图像数据保存到内存流中。
- 将内存流中的字节数组转换为 Base64 字符串。
- 输出 Base64 字符串:
- 将 Base64 字符串输出到控制台。
五、应用场景
生成的 Base64 字符串可以直接用于 Web 页面或其他需要显示图像的场景。例如,你可以在 HTML 中使用以下方式显示 Base64 图像:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
六、总结
通过结合BarcodeLib
和SkiaSharp
,我们不仅能够生成一维码,还能在其下方添加自定义文本,并最终将其转换为 Base64 字符串。这种方法适用于需要在条码下方显示额外信息(如数字或文字)的场景,同时也能满足 Web 开发中的图像显示需求。
注意:这个方法只能适合老版本的BarcodeLib
,我用的参考如下:
