前言
二維碼(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 編輯過