zoukankan      html  css  js  c++  java
  • ASP.NET Core使用SkiaSharp实现验证码

    前言

    本文并没有实现一个完成的验证码样例,只是提供了在当前.NET Core 2.0下使用Drawing API的另一种思路,并以简单Demo的形式展示出来。

    Skia

    Skia是一个开源的二维图形库,提供各种常用的API,并可在多种软硬件平台上运行。谷歌Chrome浏览器、Chrome OS、安卓、火狐浏览器、火狐操作系统以及其它许多产品都使用它作为图形引擎。

    Skia由谷歌出资管理,任何人都可基于BSD免费软件许可证使用Skia。Skia开发团队致力于开发其核心部分, 并广泛采纳各方对于Skia的开源贡献。

    SkiaSharp

    SkiaSharp是由Mono发起,基于谷歌的Skia图形库,实现的一个跨平台的2D图形.NET API绑定。提供一个全面的2D API,可用于跨移动、服务器和桌面模式的图形渲染和图像处理。

    skiasharp提供PCL和平台特定的绑定:

    • .NET Core / .NET Standard 1.3
    • Xamarin.Android
    • Xamarin.iOS
    • Xamarin.tvOS
    • Xamarin.Mac
    • Windows Classic Desktop (Windows.Forms / WPF)
    • Windows UWP (Desktop / Mobile / Xbox / HoloLens)

    使用SkiaSharp

    dotnet add package SkiaSharp --version 1.59.3
    

    ASP.NET验证码?

    前使用SkiaSharp实现文本绘图功能,代码如下:

    internal static byte[] GetCaptcha(string captchaText)
            {
                byte[] imageBytes = null;
                int image2d_x = 0;
                int image2d_y = 0;
                SKRect size;
                int compensateDeepCharacters = 0;
                using (SKPaint drawStyle = CreatePaint())
                {
                    compensateDeepCharacters = (int)drawStyle.TextSize / 5;
                    if (System.StringComparer.Ordinal.Equals(captchaText, captchaText.ToUpperInvariant()))
                        compensateDeepCharacters = 0;
                    size = SkiaHelpers.MeasureText(captchaText, drawStyle);
                    image2d_x = (int)size.Width + 10; 
                    image2d_y = (int)size.Height + 10 + compensateDeepCharacters;
                }
                using (SKBitmap image2d = new SKBitmap(image2d_x, image2d_y, SKColorType.Bgra8888, SKAlphaType.Premul))
                {
                    using (SKCanvas canvas = new SKCanvas(image2d))
                    {
                        canvas.DrawColor(SKColors.Black); // Clear 
                        using (SKPaint drawStyle = CreatePaint())
                        {
                            canvas.DrawText(captchaText, 0 + 5, image2d_y - 5 - compensateDeepCharacters, drawStyle);
                        }
                        using (SKImage img = SKImage.FromBitmap(image2d))
                        {
                            using (SKData p = img.Encode(SKEncodedImageFormat.Png, 100))
                            {
                                imageBytes = p.ToArray();
                            }
                        }
                    }
    
                }
                return imageBytes;
            }
    

    ASP.NET Core输出图像:

    [HttpGet("/api/captcha")]
    public IActionResult Captcha()
    {
        var bytes = SkiaCaptcha.Captcha.GetCaptcha("hello world");
        return File(bytes, "image/png");
    }
    

    参考

    https://skia.org/index_zh

    https://github.com/mono/SkiaSharp

    https://developer.xamarin.com/api/namespace/SkiaSharp/

    demo地址

    https://github.com/maxzhang1985/ASPNETCore_Captcha_Skia

    GitHub:https://github.com/maxzhang1985/YOYOFx 如果觉还可以请Star下, 欢迎一起交流。

    .NET Core 开源学习群:214741894

  • 相关阅读:
    34、JS/AJAX
    33、mybatis(二)
    32、mybatis
    31、springmvc(注解)
    30、springmvc
    29、Oralce(五)
    Spring学习之路-SpringBoot简单入门
    Spring学习之路-从放弃到入门
    心情日记
    Spring学习之路-从入门到放弃
  • 原文地址:https://www.cnblogs.com/maxzhang1985/p/8137199.html
Copyright © 2011-2022 走看看