亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

.NET SkiaSharp 生成二維碼驗證碼及指定區(qū)域截取方法實現(xiàn)

瀏覽:27日期:2022-06-08 16:27:56
目錄
  • 正文
  • 依賴的 Nuget 組件如下

正文

在最新版的 .NET 平臺中,微軟在逐步放棄 System.Drawing.Imaging ,給出的理由如下:

System.Drawing命名空間對某些操作系統(tǒng)和應(yīng)用程序類型有一些限制。

在Windows, System.Drawing 依賴于GDI+操作系統(tǒng)附帶的本機(jī)庫。 某些Windows SKUS Windows Server Core 或 Windows Nano)不包含此本機(jī)庫作為 OS 的一部分。 如果使用此命名空間并且無法加載庫,則運(yùn)行時將引發(fā)異常。

命名空間中的某些類型依賴于 GDI+ ,而 Windows 服務(wù)以及 ASP.NET Core 和 System.Drawing ASP.NET 應(yīng)用不支持。 這些類型在System.Drawing.Common NuGet包中,并包括 System.Drawing.Bitmap 和 System.Drawing.Font 。 但是,命名空間中的基元類型(如 System.Drawing.Color 、、 和 System.Drawing.Size System.Drawing.Point System.Drawing.Rectangle )可以在任何應(yīng)用程序中使用。

在 .NET 5 和早期版本中,System.Drawing.Common NuGet 包適用于 Windows、Linux 和 macOS。 但是,存在一些平臺差異。 在 Linux 和 macOS 上,GDI+功能由libgdiplus) 庫實現(xiàn)。 默認(rèn)情況下,大多數(shù) Linux 發(fā)行版中不會安裝此庫,也不支持 GDI+ 和 macOS 上Windows的所有功能。 還有一些平臺,其中 libgdiplus 完全不可用。 若要在 Linux 和 macOS 上使用 System.Drawing.Common 包中的類型,必須單獨(dú)安裝 libgdiplus。 有關(guān)詳細(xì)信息,請參閱在Linux 上安裝 .NET或在macOS 上安裝 .NET。

在 .NET 6 及更高版本中,System.Drawing.Common NuGet 包僅在 Windows操作系統(tǒng)上受支持。 有關(guān)詳細(xì)信息,請參閱 僅支持System.Drawing.Common Windows。

所以我將項目中原先使用 System.Drawing.Imaging 實現(xiàn)的方法采用 SkiaSharp 進(jìn)行了重寫。
SkiaSharp是 Google 的Skia 圖形庫的 .NET 包裝器,可用于跨移動、服務(wù)器和桌面平臺繪制 2D 圖形。SkiaSharp 可與 OpenGL 一起用于硬件加速渲染。SkiaSharp 最初由 Mono 開發(fā),但現(xiàn)在由 Microsoft 維護(hù),并根據(jù)MIT License提供。

依賴的 Nuget 組件如下

  • SkiaSharp
  • SkiaSharp.NativeAssets.Linux
  • SkiaSharp.QrCode
using SkiaSharp.QrCode;
namespace Common
{
    public class ImgHelper
    {
/// <summary>
/// 生成二維碼
/// </summary>
/// <param name="text">二維碼內(nèi)容</param>
/// <returns></returns>
public static byte[] GetQrCode(string text)
{
    using QRCodeGenerator generator = new();
    using var qr = generator.CreateQrCode(text, ECCLevel.L);
    SKImageInfo info = new(500, 500);
    using var surface = SKSurface.Create(info);
    using var canvas = surface.Canvas;
    canvas.Render(qr, info.Width, info.Height, SKColors.White, SKColors.Black);
    using var image = surface.Snapshot();
    using var data = image.Encode(SKEncodedImageFormat.Png, 100);
    return data.ToArray();
}
/// <summary>
/// 從圖片截取部分區(qū)域
/// </summary>
/// <param name="fromImagePath">源圖路徑</param>
/// <param name="offsetX">距上</param>
/// <param name="offsetY">距左</param>
/// <param name="width">寬度</param>
/// <param name="height">高度</param>
/// <returns></returns>
public static byte[] Screenshot(string fromImagePath, int offsetX, int offsetY, int width, int height)
{
    using var original = SKBitmap.Decode(fromImagePath);
    using SKBitmap bitmap = new(width, height);
    using SKCanvas canvas = new(bitmap);
    SKRect sourceRect = new(offsetX, offsetY, offsetX + width, offsetY + height);
    SKRect destRect = new(0, 0, width, height);
    canvas.DrawBitmap(original, sourceRect, destRect);
    using var img = SKImage.FromBitmap(bitmap);
    using SKData p = img.Encode(SKEncodedImageFormat.Png, 100);
    return p.ToArray();
}
/// <summary>
/// 獲取圖像數(shù)字驗證碼
/// </summary>
/// <param name="text">驗證碼內(nèi)容,如4為數(shù)字</param>
/// <returns></returns>
public static byte[] GetVerifyCode(string text)
{
    int width = 128;
    int height = 45;
    Random random = new();
    //創(chuàng)建bitmap位圖
    using SKBitmap image = new(width, height, SKColorType.Bgra8888, SKAlphaType.Premul);
    //創(chuàng)建畫筆
    using SKCanvas canvas = new(image);
    //填充背景顏色為白色
    canvas.DrawColor(SKColors.White);
    //畫圖片的背景噪音線
    for (int i = 0; i < (width * height * 0.015); i++)
    {
using SKPaint drawStyle = new();
drawStyle.Color = new(Convert.ToUInt32(random.Next(Int32.MaxValue)));
canvas.DrawLine(random.Next(0, width), random.Next(0, height), random.Next(0, width), random.Next(0, height), drawStyle);
    }
    //將文字寫到畫布上
    using (SKPaint drawStyle = new())
    {
drawStyle.Color = SKColors.Red;
drawStyle.TextSize = height;
drawStyle.StrokeWidth = 1;
float emHeight = height - (float)height * (float)0.14;
float emWidth = ((float)width / text.Length) - ((float)width * (float)0.13);
canvas.DrawText(text, emWidth, emHeight, drawStyle);
    }
    //畫圖片的前景噪音點(diǎn)
    for (int i = 0; i < (width * height * 0.6); i++)
    {
image.SetPixel(random.Next(0, width), random.Next(0, height), new SKColor(Convert.ToUInt32(random.Next(Int32.MaxValue))));
    }
    using var img = SKImage.FromBitmap(image);
    using SKData p = img.Encode(SKEncodedImageFormat.Png, 100);
    return p.ToArray();
}
    }
}

項目如果是在 windows 服務(wù)器下運(yùn)行則不需要任何安裝任何依賴項,如果是在 linux 服務(wù)下運(yùn)行則需要安裝 libfontconfig1,如 ubuntu 的安裝命令

apt-get update

apt-get -y install libfontconfig1

如果是采用 docker 模式運(yùn)行,則需要在 dockerfile 中添加如下配置,該命令適用于 debian 和 ubuntu 的 docker

RUN apt-get update && apt-get -y install libfontconfig1

至此 .NET 采用 SkiaSharp 生成二維碼和圖形驗證碼及圖片進(jìn)行指定區(qū)域截取方法實現(xiàn) 就講解完了,有任何不明白的,可以在文章下面評論或者私信我,歡迎大家積極的討論交流,有興趣的朋友可以關(guān)注我目前在維護(hù)的一個 .NET 基礎(chǔ)框架項目,項目地址如下

以上就是.NET SkiaSharp 生成二維碼驗證碼及指定區(qū)域截取方法實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于.NET SkiaSharp 二維碼驗證碼截取的資料請關(guān)注其它相關(guān)文章!

標(biāo)簽: ASP.NET
主站蜘蛛池模板: 成人午夜视频一区二区国语 | 爱爱激情网 | 手机看片福利日韩国产 | 国产一级做a爰片在线 | 免费黄色小视频 | 亚洲黄色在线视频 | 国产精品第三页 | 台湾成人性视频免费播放 | 亚洲国产综合在线 | 亚洲色图清纯唯美 | 动漫男女交性动漫网站 | 国产美女精品三级在线观看 | 精品久久国产 | 1024免费看| 全部免费国产潢色一级 | 亚洲 欧美 自拍 卡通 综合 | 在线看片网址 | 福利片成人午夜在线 | 4438成人成人高清视频 | 一级人做人a爰免费视频 | 欧美成人看片黄a免费 | 日本亚洲黄色片 | 我看一级黄色片 | 欧美日韩国产精品自在自线 | 91在线丝袜 | 在线国产网站 | www精品一区二区三区四区 | 毛片激情 | 国产日韩精品一区二区在线观看 | 成人毛片100部免费看 | 精品国产97在线观看 | 俄罗斯aa毛片极品 | 国产一区二区影院 | 中文字幕亚洲图片 | 久久久久久88色偷偷 | 国产免费色视频 | 青青青青久久久久国产的 | 黄色动作视频 | 北条麻妃一区二区三区 | 国产美女高清片免费观看 | 成人久久久 |