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中的多线程编程

热门文章

西游记之大圣归来 《西游记之大圣归来》是根据中国传统神话故事《西游记》进行拓展和演绎的3D动画电影。由横店影视、天空之城、燕城十月与微影时代作为出品方,高路动画、恭梓兄弟、世纪长龙、山东影视、东台龙行盛世、淮安西游产业与永康壹禾作为联合出品方出品,田晓鹏执导,张磊、林子杰、刘九容和童自荣等联袂配音。影片讲述了已于五行山下寂寞沉潜五百年的孙悟空被儿时的唐僧——俗名江流儿的小和尚误打误撞地解除了封印,在相互陪伴的冒险之旅中找回初心,完成自我救赎的故事。 作者:Pastore Antonio
1558 浏览量
ffmpeg+srs 实现直播流 这篇文章是我在做直播流的时候收集的所有素材,没有太多的整理,都放到了脑袋里面了,之后有时间了再整理成...ffmpeg+srs实现直播流 作者:Pastore Antonio
1449 浏览量
WordPress 后台编辑器样式实现直接预览 在WordPress3.0以后,有一个新的实用功能:你可以更改默认后台编辑器(TinyMCE)的样...WordPress后台编辑器样式实现直接预览 作者:Pastore Antonio
1421 浏览量
SQL Server 附加数据库之后显示为只读时解决方法 从本地分离的数据库文件放到远程服务器上,附加数据库出现数据库为(只读情况)方案一:碰到这中情况一...SQLServer附加数据库之后显示为只读时解决方法 作者:Pastore Antonio
1418 浏览量
【干货】Chrome插件(扩展)开发全攻略 写在前面我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的...【干货】Chrome插件(扩展)开发全攻略 作者:Pastore Antonio
1396 浏览量