Graphics Programming and Image Processing in .NET Core 2.x

access_time 3 years ago visibility2751 comment 0

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 Administrator at 5 days ago copyright This page is subject to Site terms.
Like this article?
Share on

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts

Want to publish your article on Kontext?

Learn more

Kontext Column

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


Learn more arrow_forward

More from Kontext

local_offer dotnetcore

visibility 3312
thumb_up 0
access_time 3 years ago

.NET Framework, you can use |DataDirectory| to configure connection string when connecting to SQL Server database file via attach mode: AttachDbFilename=|DataDirectory|\dbname.mdf In .NET Core, you cannot directly set SQL Server Express connection string by using any tokens directly. There is ...

local_offer asp.net core local_offer dotnetcore

visibility 5942
thumb_up 0
access_time 3 years ago

In ASP.NET Core, Request.UserHostAddress has been removed though that attribute exists in the traditional ASP.NET applications. We can use HttpContext.Connection to retrieve the remove client IP address: var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString(); This IP address may ...

local_offer dotnetcore

visibility 797
thumb_up 0
access_time 6 years ago

First of all, I’d like to thank you Patrick (owner of NDepend http://www.ndepend.com ) to provide me the professional license of NDepend. This is definitely a cool and powerful tool even I just started using it. In this post, I am going to introduce the simple steps I used to detect my ...

About column

Articles about ASP.NET Core 1.x, 2.x and 3.x.

rss_feed Subscribe RSS