成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_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久久久久免费精品国产| 色婷婷av一区二区三区大白胸| 国产精品素人视频| 99国产精品久久久久| 日韩手机在线导航| 国产主播一区二区| 欧美日韩二区三区| 另类中文字幕网| 色综合久久天天| 日本不卡视频在线| 国产精品一区久久久久| av一二三不卡影片| 欧美一区二视频| 国内外成人在线视频| 欧美日韩一二三| 国产丝袜在线精品| 亚洲黄一区二区三区| 亚洲三级电影在线观看| 国产精品对白交换视频 | 天天综合天天做天天综合| 99热这里只有精品8| 一区二区三区日韩在线观看| 激情综合视频| 亚洲自拍偷拍av| 噜噜噜91成人网| 日韩成人av影视| 欧美日韩三级一区二区| 国产一区二区三区免费观看| 91精品国产色综合久久不卡蜜臀 | 日本sm残虐另类| 欧美日韩在线亚洲一区蜜芽| 国产日韩精品一区二区三区| 99国产精品视频免费观看| 欧美韩国日本综合| 亚洲人成久久| 日韩电影在线免费观看| 欧美日韩国产色站一区二区三区| 国产在线播放一区二区三区| 91精品国产91久久综合桃花| 成人午夜看片网址| 国产精品久久久久久久久果冻传媒| 亚洲激情偷拍| 日本三级亚洲精品| 欧美一区二区在线观看| 亚洲va韩国va欧美va精品| 久久在线视频| 中文字幕日韩一区| 性刺激综合网| 国模少妇一区二区三区| 久久理论电影网| 在线日韩中文| 久久久久久免费| av不卡在线看| 国产综合久久久久久鬼色| 精品国产一二三区| 亚洲国产午夜| 麻豆精品精品国产自在97香蕉| 精品嫩草影院久久| 亚洲精品一区二区三区蜜桃久| 蜜桃精品视频在线| 久久久国产精品不卡| 亚欧美中日韩视频| 成人小视频免费在线观看| 日韩理论片一区二区| 欧美视频一区在线| 欧美精品网站| 看电视剧不卡顿的网站| 国产午夜亚洲精品午夜鲁丝片| 亚洲欧美日韩国产| www.亚洲色图.com| 亚洲国产成人va在线观看天堂| 欧美午夜免费影院| 麻豆专区一区二区三区四区五区| 精品国产91乱码一区二区三区 | 亚洲调教视频在线观看| 久久超碰97中文字幕| 国产精品久久久久久久久免费相片 | 亚洲精品社区| 国产精品 欧美精品| 亚洲精品乱码久久久久| 欧美一卡二卡三卡| 久久国产精品99国产| 欧美一区高清| 韩国成人在线视频| 一区二区三区在线观看动漫 | 欧美制服丝袜第一页| 国产精品大片| 日本一区二区三级电影在线观看 | 2023国产精华国产精品| 久久一本综合频道| 伊人精品在线| a4yy欧美一区二区三区| 免费在线观看一区二区三区| 国产精品三级在线观看| 91精品欧美一区二区三区综合在| 国产欧美日韩在线播放 | 亚洲国产岛国毛片在线| 欧美性一二三区| 国产日韩欧美一区二区三区四区| 成人午夜精品在线| 卡一卡二国产精品| 婷婷综合另类小说色区| 亚洲欧洲99久久| 国产调教视频一区| 日韩一级高清毛片| 欧美日韩一区小说| 久久精品天堂| 国产精品有限公司| aa国产精品| 国模吧视频一区| 91啪在线观看| 成人精品一区二区三区中文字幕 | 亚洲一区二区四区蜜桃| 中文字幕一区二区三区不卡在线 | 青草国产精品久久久久久| 亚洲黄网站在线观看| 国产精品麻豆久久久| 久久综合色一综合色88| 日韩欧美资源站| 欧美精品高清视频| 欧美日韩成人高清| 欧美日韩国产天堂| 欧美日韩成人综合| 欧美日韩精品一二三区| 精品视频123区在线观看| 久久亚洲二区| 91久久精品一区二区二区| 国产日韩在线一区二区三区| 在线欧美视频| 亚洲区欧美区| 国产欧美一区二区色老头| 99日韩精品| 性色一区二区| 91黄色免费看| 欧美三区免费完整视频在线观看| 在线精品观看国产| 欧美三级日韩三级国产三级| 欧美亚日韩国产aⅴ精品中极品| 在线视频一区二区三| 欧洲亚洲国产日韩| 欧美日产国产精品| 日韩欧美另类在线| 久久伊99综合婷婷久久伊| 久久精品一区四区| 亚洲欧洲精品一区二区精品久久久| 国产精品福利一区| 亚洲一区免费观看| 日韩av在线播放中文字幕| 麻豆国产精品一区二区三区| 久热成人在线视频| 国产精品久久久久桃色tv| 亚洲免费电影在线| 亚洲国产精品久久一线不卡| 日韩激情一区二区| 国产裸体歌舞团一区二区| 大白屁股一区二区视频| 欧美a级在线| 精品在线播放午夜| 国产日韩视频| 欧美视频一区二区三区四区| 欧美精品v日韩精品v韩国精品v| 欧美一级欧美三级在线观看| 久久青草国产手机看片福利盒子 | 欧美videos大乳护士334| 国产亚洲美州欧州综合国| 亚洲欧洲国产日本综合| 婷婷综合五月天| 成人午夜av在线| 亚洲福利电影| 欧洲在线/亚洲| 久久久不卡影院| 亚洲高清一区二区三区| 国产在线不卡一区| 欧美视频导航| 在线这里只有精品| 亚洲最黄网站| 欧美日韩精品三区| 国产午夜精品美女毛片视频| 亚洲狠狠爱一区二区三区| 国产毛片精品视频| 国产精品扒开腿做爽爽爽软件| 美女国产精品| 久久久亚洲精华液精华液精华液| 亚洲精品中文在线观看| 国产呦精品一区二区三区网站| 欧美精品一卡| 欧美性色黄大片| 国产精品国产自产拍在线| 久久99九九99精品| 精品不卡一区| 欧美一三区三区四区免费在线看| 久久精品一二三区| 国产亚洲精品精华液| 亚洲第一福利视频在线| 99久久夜色精品国产网站| 乱人伦精品视频在线观看| 久久众筹精品私拍模特| 日韩电影在线免费|