By using this site, you acknowledge that you have read and understand our Cookie policy, Privacy policy and Terms .

In .NET Core 2.x, Windows Forms or WPF are not implemented since they are based on GDI+ and DirectX respectively in Windows. In .NET Core 3.0, there is plan to add Desktop Packs which includes UWP. WPF and Windows Forms. However, they will still be Windows-only. In .NET Core applications, you may need to generate or process images. To do that, there are quite a few third party libraries you can use even they don’t implement all the functionalities in .NET Framework. For example, the following open source projects are available to use:

  • CoreCompat.System.Drawing
  • ImageSharp
  • Magick.NET
  • SkiaSharp
  • FreeImage-dotnet-core
  • MagicScaler

In Microsoft official .NET blog, there is a post summarizes these core features of these libraries and performance comparisons.

In this page, I am going to show you how to draw a captcha image using CoreCompat.System.Drawing.

Sample code

The following code snippet shows how to create a bitmap image and save to HTTP response stream.

The main steps used are listed below:

  • Instantiate a Bitmap object
  • Use the Bitmap object to create a Graphics object
  • Use the Graphics object to draw strings and lines. Font style and colour brushes can be applied. For these .NET core libraries, not all the .NET Framework brushes or fonts are implemented.
  • Save the Bitmap object as file or into streams.

The code is very similar to the one I created in one of the previous posts.

private void ProcessRequest(HttpContext context)
         {
             // Setup output format
             context.Response.ContentType = "image/gif";
             Random random = new Random();
            // Generate random characters
             StringBuilder s = new StringBuilder();
            // Create the image
             using (Bitmap bitmap = new Bitmap(captchaOptions.ImageWidth, captchaOptions.ImageHeight))
             {
                 // Create the graphics
                 using (Graphics graphics = Graphics.FromImage(bitmap))
                 {
                     // Write bg color
                     graphics.FillRectangle(new SolidBrush(bgColor), 0, 0, captchaOptions.ImageWidth, captchaOptions.ImageHeight);
                    // Font
                     using (Font font = new Font(FontFamily.GenericSerif, 32, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Pixel))
                     {
                         for (int i = 0; i < captchaOptions.CodeLength; i++)
                         {
                             s.Append(captchaOptions.CaptchaString.Substring(random.Next(0, captchaOptions.CaptchaString.Length - 1), 1));
                             // Write char to the graphic
                             graphics.DrawString(s[s.Length - 1].ToString(), font, new SolidBrush(codeColor), i * 32, random.Next(0, 24));
                         }
                     }
                    // Add obstructions
                     using (Pen pen = new Pen(new SolidBrush(this.obsColor), 1))
                     {
                         for (int i = 0; i < 10; i++)
                         {
                             graphics.DrawLine(pen, new Point(random.Next(0, captchaOptions.ImageWidth - 1), random.Next(0, captchaOptions.ImageHeight - 1)), new Point(random.Next(0, captchaOptions.ImageWidth - 1), random.Next(0, captchaOptions.ImageHeight - 1)));
                         }
                     }
                     for (int i = 0; i < 100; i++)
                     {
                         bitmap.SetPixel(random.Next(captchaOptions.ImageWidth), random.Next(captchaOptions.ImageHeight), Color.FromArgb(random.Next()));
                     }
                    context.Session.Set(captchaOptions.SessionName, Encoding.UTF8.GetBytes(s.ToString().ToLower()));
                    // Save image
                     bitmap.Save(context.Response.Body, System.Drawing.Imaging.ImageFormat.Gif);
                 }
             }
         }

Sample output

The following is a sample captcha image in this website.

image

info Last modified by Raymond at 2 months ago * This page is subject to Site terms.

More from Kontext

local_offer asp.net core 2 local_offer asp.net core local_offer dotnetcore local_offer open-banking

visibility 216
thumb_up 0
access_time 2 years ago

I’ve just started an asp.net core 2.2 based implementation for Australia Consumer Data Standards (published by Data 61). Opening Banking initiative will follow these standards. The purpose is to help you to get familiar with these standards, especially the APIs that need to be implemented. ...

open_in_new View open_in_new ASP.NET Core

local_offer .net core local_offer lite-log

visibility 2005
thumb_up 0
access_time 2 years ago

After upgrading to ASP.NET Core 2.1 (.NET Core SDK 2.1.301), you may encounter the following error about encoding: System.ArgumentException    HResult=0x80070057    Message='Cyrillic' is not a supported encoding name. For information on defining a cus...

open_in_new View open_in_new ASP.NET Core

local_offer sqlite local_offer .net core local_offer entity-framework

visibility 16886
thumb_up 1
access_time 2 years ago

SQLite is a self-contained and embedded SQL database engine. In .NET Core, Entity Framework Core provides APIs to work with SQLite. This page provides sample code to create a SQLite database using package Microsoft.EntityFrameworkCore.Sqlite . Create sample project ...

open_in_new View open_in_new .NET Framework

local_offer .net core

visibility 5014
thumb_up 0
access_time 3 years ago

.NET core introduces a logging API that works with a number of logging frameworks. The built-in providers are configurable and extensible to support different level loggings.

open_in_new View open_in_new .NET Framework

info About author

Dark theme mode

Dark theme mode is available on Kontext.

Learn more arrow_forward
Kontext Column

Kontext Column

Created for everyone to publish data, programming and cloud related articles. Follow three steps to create your columns.

Learn more arrow_forward
info Follow us on Twitter to get the latest article updates. Follow us