成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

正文

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

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

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

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

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

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

所以我將項目中原先使用 System.Drawing.Imaging 實現(xiàn)的方法采用 SkiaSharp 進行了重寫。
SkiaSharp是 Google 的Skia 圖形庫的 .NET 包裝器,可用于跨移動、服務器和桌面平臺繪制 2D 圖形。SkiaSharp 可與 OpenGL 一起用于硬件加速渲染。SkiaSharp 最初由 Mono 開發(fā),但現(xiàn)在由 Microsoft 維護,并根據(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);
    }
    //畫圖片的前景噪音點
    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 服務器下運行則不需要任何安裝任何依賴項,如果是在 linux 服務下運行則需要安裝 libfontconfig1,如 ubuntu 的安裝命令

apt-get update

apt-get -y install libfontconfig1

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

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

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

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

標簽: ASP.NET
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
色老综合老女人久久久| 波多野结衣亚洲| 成人免费黄色在线| 欧美人伦禁忌dvd放荡欲情| 亚洲欧美激情插| 91色视频在线| 久久亚洲综合色一区二区三区| 成人亚洲一区二区一| 欧美一区二区三区视频| 国产一区二区视频在线播放| 欧美日韩国产综合一区二区三区| 麻豆精品精品国产自在97香蕉 | 亚洲成人在线观看视频| 99re国产精品| 亚洲色图欧洲色图婷婷| 在线 亚洲欧美在线综合一区| 中文乱码免费一区二区| 欧美尤物一区| 日本一区二区三区四区在线视频| 牛人盗摄一区二区三区视频| 久久精品视频在线免费观看| 午夜国产精品视频| 国产精品美女久久久久久久久久久 | 亚洲精品一线二线三线无人区| 国产一区二区三区四区五区美女| 欧美精品免费视频| 国产综合色在线视频区| 欧美三级三级三级| 国产真实乱子伦精品视频| 欧美一区二区视频在线观看2020| 大尺度一区二区| 久久久精品黄色| 亚洲视频精品| 一区二区三区高清在线| 午夜一区二区三区不卡视频| 午夜电影网一区| 色婷婷激情久久| 精品中文字幕一区二区小辣椒| 91精品国产综合久久蜜臀 | 国产一级精品在线| 777xxx欧美| 日本一区二区三区四区在线视频| 18涩涩午夜精品.www| 国产欧美日韩综合一区在线观看| 不卡一区在线观看| 国产精品日韩成人| 91色在线porny| 亚洲二区在线视频| 亚洲精品一级| 精品sm在线观看| 亚洲第一在线| 久久婷婷国产综合精品青草| 亚洲一级电影| 91国产免费看| 亚洲在线中文字幕| 99成人精品| 日日骚欧美日韩| 欧美日韩国产一级| 午夜精品影院在线观看| 欧美日韩精品一区二区在线播放 | 欧美国产欧美综合| 亚洲伦伦在线| 欧美日韩成人高清| 99v久久综合狠狠综合久久| 亚洲欧美视频在线观看| 在线观看网站黄不卡| 国产成人午夜电影网| 国产精品系列在线| 久久av二区| 国产91丝袜在线播放0| 国产日产欧美精品一区二区三区| 99精品欧美一区二区三区| 蜜桃精品视频在线| 久久亚洲私人国产精品va媚药| 1000部精品久久久久久久久| 奇米影视7777精品一区二区| 欧美成人精品福利| 99精品国产在热久久| 九九国产精品视频| 中文字幕av资源一区| 久久久久中文| av午夜精品一区二区三区| 亚洲乱码日产精品bd| 欧美理论电影在线| 欧美日韩国产色综合一二三四| 亚洲国产一区二区a毛片| 欧美一区二区在线视频| 1024精品一区二区三区| 激情综合五月天| 国产精品成人免费精品自在线观看| 色爱区综合激月婷婷| 欧美+日本+国产+在线a∨观看| 亚洲h在线观看| 一区二区三区四区五区视频| 狠狠色伊人亚洲综合成人| 中文在线一区二区| 欧美性生活大片视频| 韩日精品在线| 国产一区二区三区久久久| 国产精品人成在线观看免费 | 奇米精品一区二区三区在线观看| www国产精品av| 久久亚洲二区| 欧美日韩一区二区视频在线 | 久久看片网站| 91免费在线看| 麻豆91免费观看| 国产欧美综合在线| 欧美日韩亚洲综合在线 | 蜜臀国产一区二区三区在线播放 | 欧美精品一区二区视频| 免费精品视频在线| 国产精品久久久一本精品| 欧美日韩一区三区| av成人天堂| 97久久超碰国产精品| 日韩成人免费电影| 中文字幕中文乱码欧美一区二区 | 尤物视频一区二区| 精品捆绑美女sm三区| 色婷婷av一区二区三区软件| 亚洲性感激情| 成人看片黄a免费看在线| 日韩电影在线一区| 亚洲婷婷综合久久一本伊一区 | 亚洲综合一区二区精品导航| 久久久精品欧美丰满| 欧美日韩国产另类不卡| 国产日韩一区欧美| 97精品超碰一区二区三区| 久久er99热精品一区二区| 18欧美乱大交hd1984| 精品国产一区二区三区av性色| 国产原创一区二区三区| 性久久久久久久久久久久| 国产精品国产三级国产a | 一区二区三区免费看视频| 2021中文字幕一区亚洲| 91精品婷婷国产综合久久竹菊| 老鸭窝毛片一区二区三区| 欧美日韩亚洲一区在线观看| 国产精品1区2区| 免费精品视频在线| 亚洲欧美成人一区二区三区| 久久精品亚洲一区二区三区浴池| 91麻豆精品91久久久久久清纯| 久久综合激情| 国产精品区二区三区日本| 欧美日韩亚洲一区二区三区在线 | 亚洲黄色av一区| 国产日韩在线不卡| 欧美mv日韩mv国产网站app| 欧美日韩一级片网站| 一区二区三区|亚洲午夜| 欧美午夜在线视频| 91色九色蝌蚪| 成人app在线| 处破女av一区二区| 国产精品1区2区3区在线观看| 精品在线播放午夜| 日本欧美一区二区在线观看| 午夜一区二区三区在线观看| 亚洲已满18点击进入久久| 亚洲免费成人av| 亚洲欧美自拍偷拍| 中文字幕亚洲成人| 国产精品白丝在线| 日韩毛片高清在线播放| 中文字幕亚洲一区二区va在线| 国产精品福利一区二区| 一区二区中文视频| 国产精品久久久久久户外露出 | 亚洲少妇一区| 亚洲精品一级| 一区二区激情| 国产高清精品在线| 在线精品视频一区二区| 亚洲国产一区二区在线播放| 亚洲高清毛片| 亚洲嫩草精品久久| 一本色道88久久加勒比精品| 国产日产欧美一区二区视频| 91电影在线观看| 国产精品v欧美精品v日韩| 国产剧情一区二区| 亚洲一二三级电影| 国产喷白浆一区二区三区| 欧美一区二区三区人| 久久综合影音| 日韩精品三区四区| 欧美日韩国产综合久久| 欧美日韩高清在线一区| 午夜精品久久久久久| 欧美美女激情18p| 国产亚洲精品v| 韩国久久久久| 国产成人精品三级| 午夜精品福利一区二区三区蜜桃| 国产精品国产馆在线真实露脸| 欧美三级视频在线|