Logo

C# 中使用 SkiaSharp 生成一维码并转换为 Base64 字符串

photo

2025年03月07日

在开发过程中,我们常常需要生成条码(如一维码或二维码)以满足各种业务需求。例如,物流系统中的包裹追踪、零售系统中的商品编码等。今天,我们将通过 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..." />

六、总结

通过结合BarcodeLibSkiaSharp,我们不仅能够生成一维码,还能在其下方添加自定义文本,并最终将其转换为 Base64 字符串。这种方法适用于需要在条码下方显示额外信息(如数字或文字)的场景,同时也能满足 Web 开发中的图像显示需求。

注意:这个方法只能适合老版本的BarcodeLib,我用的参考如下:

橙子主题打折出售

其实我不卖,主要是这里是放广告的,所以就放了一个
毕竟主题都没做完,卖了也是坑.

购买它
所有附件
本文为原创文章,请注意保留出处!

留言板

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

清除AD RMS的配置 2025年03月07日

要清除ADRMS的配置以便重新安装,需要删除ADRMS的服务连接点(SCP)以及相关的配置信息。...清除ADRMS的配置

在C#WinForms应用程序中,多线程编程是一个强大的工具,可以帮助我们提高应用程序的响应性和性能...C#WinForms中的多线程编程

热门文章

无法握住的故土 在我们心灵最温暖的角落,总有一寸土地是属于故乡的。虽然我们看似已远离故土,可骨子里对故乡的依恋却是从未冷却过。我们无论漂泊他乡,还是在繁华都市平步青云,可故乡的悠悠情思总会潜入梦乡与你缠绵。是儿时那一缕缕茉莉的清香萦绕在梦境,也是邻家那已锈迹斑斑的铁壶里,开出艳丽的花儿在梦的边缘摇曳。故土就这样根深蒂固地在我们的灵魂深处烙下深深的印记。 作者:Pastore Antonio
1596 浏览量
EWS(Exchange Service)基本使用(获取个人会议,会议室会议内容,会议室列表,发送会议,修改会议,删除会议) 最近公司要求和exchange服务对接,所以稍微研究了一下官方文档,做出以下总结,欢迎大家补充。先...EWS(ExchangeService)基本使用(获取个人会议,会议室会议内容,会议室列表,发送会议,修改会议,删除会议) 作者:Pastore Antonio
1585 浏览量
Sql Server 部署SSIS包完成远程数据传输 本篇介绍如何使用SSIS和作业完成自动更新目标数据任务。**温馨提示:如需转载本文,请注明...SqlServer部署SSIS包完成远程数据传输 作者:Pastore Antonio
1576 浏览量
SQL Server AG集群启动不起来的临时自救大招 背景前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群...SQLServerAG集群启动不起来的临时自救大招 作者:Pastore Antonio
1570 浏览量
windows 下安装 memcahce 官网上并未提供Memcached的Windows平台安装包,我们可以使用以下链接来下载,你需...windows下安装memcahce 作者:Pastore Antonio
1565 浏览量