前言
二维码(Quick Response Code)也称二维条码,是流行的一种编码方式,它比条形码(Barcode)能储存更多的信息。现在的很多场景都在使用。使用C#如何实现二维码的生成,本文介绍二种实现二维码的类库及其实现。
QRCoder
QRCoder是一个用 C# 编写的简单库,可以实现二维码的生成。它不依赖其它外部库,项目使用是通过NuGet引用。
下面通过示例演示实现:
定义一个获取二维码中间图片的方法
/// <summary>/// 获取显示在二维码中间的图片/// </summary>/// <param name="iconPath"></param>/// <returns></returns>public Bitmap GetBitmap(string iconPath){ if (File.Exists(iconPath)) { return new Bitmap(iconPath); } return null;}
/// <summary>/// 生成二维码/// </summary>/// <param name="qrCodeContent ">二维码的内容</param>/// <param name="imagePath ">显示在二维码中间的图片</param>/// <param name="level">QR码的纠错能力,由低到高:L、M、Q、H。</param>public void Generator(string qrCodeContent,string imagePath, ECCLevel level){ using (QRCodeGenerator qrGenerator = new QRCodeGenerator()) { using (QRCodeData qrCodeData = qrGenerator.CreateQrCode(qrCodeContent, level)) { int iconSize = 15; using (QRCode qrCode = new QRCode(qrCodeData)) { using (Bitmap bitmap = qrCode.GetGraphic(20, Color.Black, Color.White, GetBitmap(imagePath), (int)iconSize)) { string qrImagePath = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "qr.png"); bitmap.Save(qrImagePath); } } } }}
namespace Fountain.WinConsole.QRCodeDemo{ internal class Program { static void Main(string[] args) { QRExtend qRExtend = new QRExtend(); qRExtend.Generator("dotNet开发技术分享", string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "1.jpeg"), QRCoder.Core.QRCodeGenerator.ECCLevel.M); Console.ReadKey(); } }}
SkiaSharp.QrCode
SkiaSharp是基于Google的Skia图形库的.NET封装,它用于2D图像绘制的开源库。适用于多个平台包括Windows、macOS、Linux等。而它也提供了二维码的库SkiaSharp.QrCode(跨平台支持)。项目使用通过NuGet引用SkiaSharp.QrCode。
下面通过示例演示实现:
定义一个获取二维码中间图片的方法
/// <summary>/// 获取显示在二维码中间的图片/// </summary>/// <param name="iconPath"></param>/// <returns></returns>public SKData GetSKData(string iconPath){ if (File.Exists(iconPath)) { return SKData.Create(iconPath); } return null;}
定义生成二维码的方法
/// <summary>/// 生成二维码/// </summary>/// <param name="qrCodeContent ">二维码的内容</param>/// <param name="imagePath ">显示在二维码中间的图片</param>/// <param name="level">QR码的纠错能力,由低到高:L、M、Q、H。</param>public void Generator(string text, string imagePath, ECCLevel level){ using (QRCodeGenerator generator = new QRCodeGenerator()) { using (QRCodeData qRCode = generator.CreateQrCode(text, ECCLevel.H)) { // 创建一个Canvas SKImageInfo info = new SKImageInfo(300, 300); using (SKSurface surface = SKSurface.Create(info)) { SKCanvas canvas = surface.Canvas; // 渲染二维码到Canvas canvas.Render(qRCode, info.Width, info.Height); // 获取二维码中间绘制图片数据 SKData sKData = GetSKData(imagePath); if (sKData != null) { // 在二维码中间绘制图片 如头像 using (var avatarImage = SKImage.FromEncodedData(SKData.Create(imagePath))) { // 按比率缩放中间图片大小 float ratio = (float)140 / info.Width; int width = (int)(140* ratio); int height = (int)(140 * ratio); //定义绘制头像的位置和尺寸 var rect = SKRect.Create((info.Width - width) / 2, (info.Height - height) / 2, width, height); //绘制头像 canvas.DrawImage(avatarImage, rect); } } // 输出到文件 using (SKImage image = surface.Snapshot()) { using (var imageData = image.Encode(SKEncodedImageFormat.Png, 100)) { using (var stream = File.OpenWrite(@"QRCode.png")) { // 保存图片 imageData.SaveTo(stream); } } } } } }}
调用生成
using SkiaSharp.QrCode;namespace Fountain.WinConsole.QRCodeDemo{ internal class Program { static void Main(string[] args) { QRExtend qRGExtend = new QRGxtend(); qRExtend.Generator("dotNet开发技术分享公众号", string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "1.jpeg"), ECCLevel.M); Console.ReadKey(); } }}
小结
以上是在C#中使用QRCoder与SkiaSharp.QrCode 两个类实现简单的示例。希望本文对您有所收获。
该文章在 2024/12/24 9:47:01 编辑过