日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

.NET SkiaSharp 生成二維碼驗證碼及指定區域截取方法實現

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

正文

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

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

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

命名空間中的某些類型依賴于 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) 庫實現。 默認情況下,大多數 Linux 發行版中不會安裝此庫,也不支持 GDI+ 和 macOS 上Windows的所有功能。 還有一些平臺,其中 libgdiplus 完全不可用。 若要在 Linux 和 macOS 上使用 System.Drawing.Common 包中的類型,必須單獨安裝 libgdiplus。 有關詳細信息,請參閱在Linux 上安裝 .NET或在macOS 上安裝 .NET。

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

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

依賴的 Nuget 組件如下

  • SkiaSharp
  • SkiaSharp.NativeAssets.Linux
  • SkiaSharp.QrCode
using SkiaSharp.QrCode;
namespace Common
{
    public class ImgHelper
    {
/// <summary>
/// 生成二維碼
/// </summary>
/// <param name="text">二維碼內容</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>
/// 從圖片截取部分區域
/// </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>
/// 獲取圖像數字驗證碼
/// </summary>
/// <param name="text">驗證碼內容,如4為數字</param>
/// <returns></returns>
public static byte[] GetVerifyCode(string text)
{
    int width = 128;
    int height = 45;
    Random random = new();
    //創建bitmap位圖
    using SKBitmap image = new(width, height, SKColorType.Bgra8888, SKAlphaType.Premul);
    //創建畫筆
    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 生成二維碼和圖形驗證碼及圖片進行指定區域截取方法實現 就講解完了,有任何不明白的,可以在文章下面評論或者私信我,歡迎大家積極的討論交流,有興趣的朋友可以關注我目前在維護的一個 .NET 基礎框架項目,項目地址如下

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

標簽: ASP.NET
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产国产精品| 麻豆91精品视频| 亚洲精品日本| 日韩精品诱惑一区?区三区| 亚洲一区黄色| 99国产成+人+综合+亚洲欧美| 国产精东传媒成人av电影| 国产韩日影视精品| 三上悠亚国产精品一区二区三区 | 久久精品一区二区三区中文字幕| 妖精视频成人观看www| 国产精品毛片在线看| 久久国产电影| 国产 日韩 欧美 综合 一区| 国产精品美女久久久久久不卡| 91精品视频一区二区| 日本精品在线播放| 综合激情网...| 日本不卡在线视频| 欧美一级网站| 国产精品毛片久久| 日韩国产一区二区| 欧美精品一区二区三区精品| 欧美日韩国产欧| 日本成人手机在线| 美女国产一区二区三区| 日韩欧美一区免费| 国产精品视区| 免费在线欧美黄色| 久久精品中文| 视频一区欧美日韩| 久久免费影院| 日本综合字幕| 亚洲一区久久| 精品一级视频| 五月婷婷亚洲| 国产精品jk白丝蜜臀av小说| 日韩综合精品| 亚洲三级观看| 麻豆精品99| 亚洲深深色噜噜狠狠爱网站 | 黄色国产精品| 欧美日韩 国产精品| 激情综合婷婷| 天堂va欧美ⅴa亚洲va一国产| 精品72久久久久中文字幕| 欧美日韩色图| 精品久久久网| 亚洲资源网站| 欧美日韩国产欧| 成人啊v在线| 欧美一区自拍| 蜜臀av亚洲一区中文字幕| 国产精久久久| 国产精品66| 日精品一区二区三区| 99久精品视频在线观看视频| 久久不卡日韩美女| 欧美日韩少妇| 日韩成人a**站| 日韩不卡一二三区| 亚洲成人一区| 99久久99视频只有精品 | 69堂精品视频在线播放| 免播放器亚洲| 欧美好骚综合网| 精品黄色一级片| 国产欧美丝祙| 日韩av影院| 国产麻豆一区二区三区 | 久久影院资源站| 国产精品亚洲人成在99www | 秋霞影院一区二区三区| 国产不卡一区| 日本少妇一区| 欧美男人天堂| 精品国产麻豆| 老司机精品视频网| 高清一区二区三区av| 精品亚洲二区| 日韩一区三区| 日韩在线第七页| 欧美va天堂在线| 日韩在线短视频| av高清一区| 国产精品美女| 日韩手机在线| 久久的色偷偷| 岛国av免费在线观看| 亚洲v在线看| 美女久久久久| 亚洲精品乱码日韩| 国产精品毛片久久久| 麻豆精品蜜桃| 视频一区日韩| 久久精品国产福利| 99国产精品99久久久久久粉嫩| 免费日韩视频| 日韩 欧美一区二区三区| 国产精品4hu.www| 在线日韩中文| 国产欧美一区二区色老头| 人人草在线视频| 最新国产精品视频| 国产一区二区三区亚洲综合| 日韩一区二区免费看| 国产剧情一区二区在线观看| 99tv成人| 奇米亚洲欧美| 激情欧美一区| 精品三级国产| 亚洲一区不卡| 日韩欧美二区| 日韩av电影一区| 美女亚洲一区| 成人精品久久| 麻豆视频一区| 91精品日本| 蜜桃av一区二区在线观看| 日韩中文首页| 国产精品久久久久久久久免费高清 | 日韩高清欧美激情| 精品一区欧美| 精品视频自拍| 国产欧美日韩一区二区三区四区| 久久中文亚洲字幕| 嫩草伊人久久精品少妇av杨幂| 少妇精品在线| 亚洲二区在线| 一区二区三区四区日本视频| 韩国一区二区三区视频| 日韩精品久久理论片| 美女久久网站| 亚洲精品在线观看91| 1024精品一区二区三区| 国产成人精选| 蜜桃成人精品| 亚洲天堂免费电影| 理论片午夜视频在线观看| 精品久久91| 黄毛片在线观看| 国产精品调教视频| 国产丝袜一区| 免费一区二区三区在线视频| 国产精品久久国产愉拍| 国产欧美日韩精品一区二区三区| 欧美一区自拍| 国产精品永久| 精品久久亚洲| 色偷偷色偷偷色偷偷在线视频| 久久99性xxx老妇胖精品| 国产日产一区| 久久久国产精品入口麻豆| 久久精品免费看| 91av亚洲| 视频一区在线视频| 亚洲女同一区| 亚洲理论在线| 欧美精品国产一区| 日韩大片在线| 国产视频亚洲| 日韩va亚洲va欧美va久久| 国产精品玖玖玖在线资源| 天堂av在线| 国产视频一区三区| 国产精品亲子伦av一区二区三区| 国产精品久久久久久久免费观看| 午夜免费一区| 少妇精品在线| 成人日韩在线| 亚洲综合日韩| 麻豆精品久久久| 麻豆精品蜜桃| 久久精品超碰| 亚洲国产综合在线看不卡| 亚洲精品极品| 国产精品一区二区三区www| 欧美日韩色图| 久久的色偷偷| 人人精品人人爱| 久久亚洲黄色| 日韩国产91| 亚洲综合二区| 欧美日韩国产观看视频| 久久国产精品色av免费看| 99热国内精品| 福利在线一区| 欧美天堂一区二区| 午夜在线视频一区二区区别| 日产精品一区二区| 国产精品久久久久久妇女| 婷婷综合福利| 欧美日韩精品一区二区视频| 精品午夜久久| 日韩av电影一区| 中文字幕亚洲精品乱码| 播放一区二区| 日韩成人综合| 精品日产乱码久久久久久仙踪林| 香蕉久久久久久|