成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_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国内精品久久久久久久
99精品福利视频| 久久久久久夜| 亚洲免费激情| 麻豆成人在线播放| 欧美日韩高清一区| 2024国产精品视频| 亚洲女子a中天字幕| 婷婷国产v国产偷v亚洲高清| 丝袜美腿亚洲色图| 狠狠v欧美v日韩v亚洲ⅴ| 粉嫩蜜臀av国产精品网站| 99国产精品99久久久久久| 欧美日韩日本国产亚洲在线| 亚洲免费播放| 在线综合视频播放| 国产精品国产三级国产三级人妇| 亚洲国产乱码最新视频 | 国产欧美日韩卡一| 亚洲综合一区二区精品导航| 激情综合色播五月| 国内激情久久| 欧美高清一级片在线| 国产欧美精品国产国产专区| 天堂在线亚洲视频| 99精品欧美一区二区蜜桃免费 | 欧美成人午夜| 欧美欧美欧美欧美| 亚洲靠逼com| 99九九99九九九视频精品| 日本韩国欧美一区| 亚洲日穴在线视频| 欧美在线播放一区| 欧美福利视频一区| 青青草国产精品亚洲专区无| 午夜精品国产| 久久综合一区二区| 国产在线精品一区在线观看麻豆| 影音先锋久久资源网| 欧美一级欧美三级| 久久综合色鬼综合色| 精品无码三级在线观看视频| 国产在线日韩| 久久综合久久综合久久| 三级欧美韩日大片在线看| 成人黄色片在线观看| 欧美中文日韩| 亚洲精品视频在线| 欧美国产综合视频| 久久久精品免费免费| 免费在线视频一区| 久久精品五月| 亚洲高清免费一级二级三级| 欧美福利视频| 久久午夜免费电影| 成人性生交大片免费看中文网站| 美脚丝袜一区二区三区在线观看| 亚洲国产精品av| 成人一级黄色片| 欧美日韩1234| 国产乱码精品一区二区三区五月婷| 国产麻豆综合| 日韩国产欧美在线播放| 日本乱人伦aⅴ精品| 秋霞午夜鲁丝一区二区老狼| 欧美亚洲免费| 丝袜美腿亚洲色图| 在线亚洲观看| 一区二区三区不卡视频在线观看| 99亚洲视频| 国产精品福利一区| 亚洲精品欧洲精品| 午夜欧美在线一二页| 日本韩国精品一区二区在线观看| 午夜免费久久看| 日韩欧美在线1卡| 欧美日韩综合网| 视频一区视频二区在线观看| 欧美性生活一区| 欧美a级片网站| 一区二区三区欧美| 欧美三日本三级三级在线播放| 国产91精品一区二区麻豆亚洲| 555夜色666亚洲国产免| 欧美区一区二| 黄页视频在线91| 精品国产一区二区三区四区四 | 91精品国产麻豆| 97精品国产露脸对白| 久久精品国产秦先生| 欧美激情艳妇裸体舞| 在线观看日韩高清av| 欧美日韩一区二区视频在线| 亚洲地区一二三色| 国产日产欧美一区二区视频| 色狠狠av一区二区三区| 国内精品久久久久久久97牛牛 | 精品国产91洋老外米糕| 国产日韩专区| 欧美福利专区| 国产成人在线免费| 午夜伊人狠狠久久| 中文字幕色av一区二区三区| 一区二区国产精品| 国产成人在线视频网站| 日韩在线卡一卡二| 自拍偷拍国产亚洲| 日本一区免费视频| 精品免费日韩av| 久久高清一区| 国产精品久久久一区二区三区| 成人性视频免费网站| 美日韩黄色大片| 亚洲丝袜美腿综合| 亚洲精品视频一区| 中文字幕亚洲综合久久菠萝蜜| 欧美精品在线一区二区三区| 中文网丁香综合网| 亚洲国产精品一区二区第一页 | 国产69精品久久777的优势| 首页国产欧美久久| 亚洲高清中文字幕| 亚洲主播在线播放| 视频在线观看一区| 久久福利视频一区二区| 国产精品私人影院| 欧美韩日一区二区三区| 国产精品理论片| 亚洲人成小说网站色在线| 亚洲男女毛片无遮挡| 亚洲理论在线观看| 亚洲午夜视频在线| 国产一区二三区| 亚洲精品孕妇| 国产区欧美区日韩区| 精品久久久久久最新网址| 亚洲激情五月婷婷| 国产99精品视频| 国产精品一级久久久| 日韩一卡二卡三卡国产欧美| 亚洲欧洲精品成人久久奇米网| 亚洲人成在线播放网站岛国| av在线不卡免费看| 欧美日韩国产成人在线免费| 国产精品无码永久免费888| 国产在线一区观看| 久久久999| 一区二区三区免费网站| 色综合天天在线| 久久久久国产精品一区三寸| 久久在线观看免费| 丁香婷婷综合色啪| 欧美日韩免费电影| 毛片av一区二区| 亚洲影视在线| 久久这里只有精品6| 中文字幕一区二区视频| 国产精品一区久久久久| 色老头久久综合| 亚洲第一狼人社区| 国产欧美欧美| 亚洲地区一二三色| 亚洲精品无人区| 国产精品萝li| 91一区一区三区| 日韩三级视频在线看| 成人精品免费看| 欧美精品一区二区不卡| 91污片在线观看| 久久久精品天堂| 激情综合久久| 亚洲美女视频一区| 亚洲欧洲精品一区二区| 国产婷婷一区二区| 亚洲欧洲日本国产| 亚洲国产一区二区在线播放| 免费在线国产精品| 国产一区二区三区香蕉| 欧美大片在线观看一区| 成人激情免费电影网址| 欧美成人女星排行榜| 一色屋精品视频在线看| 亚洲一区二区视频| 91精品国产综合久久精品| 丁香桃色午夜亚洲一区二区三区| 久久午夜电影网| 成人综合在线视频| 日本一区二区久久| 久久一二三四| 不卡的av中国片| 亚洲一级二级在线| 亚洲经典视频在线观看| 日本系列欧美系列| 欧美国产日本视频| 欧美视频精品在线观看| 狠狠色狠狠色综合日日91app| 在线播放中文一区| 日韩一区二区久久| 国产高清精品网站| 亚洲一二三四区| 精品三级在线看|