如何在 .NET Core 中使用 System.Drawing?

发布时间 2023-07-23 06:39:00作者: 宁静致远.

Microsoft 发布了System.Drawing.Common以提供跨平台访问 GDI+ 图形功能。

这是一个超级简单的应用程序,可将 PNG 大小调整为 128x128。然而,它是一个 .NET Core 应用程序,并且可以在 Windows 和 Linux(Ubuntu!)

 

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
 
namespace imageresize
{
    class Program
    {
        static void Main(string[] args)
        {
            int width = 128;
            int height = 128;
            var file = args[0];
            Console.WriteLine($"Loading {file}");
            using(FileStream pngStream = new FileStream(args[0],FileMode.Open, FileAccess.Read))
            using(var image = new Bitmap(pngStream))
            {
                var resized = new Bitmap(width, height);
                using (var graphics = Graphics.FromImage(resized))
                {
                    graphics.CompositingQuality = CompositingQuality.HighSpeed;
                    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    graphics.CompositingMode = CompositingMode.SourceCopy;
                    graphics.DrawImage(image, 0, 0, width, height);
                    resized.Save($"resized-{file}", ImageFormat.Png);
                    Console.WriteLine($"Saving resized-{file} thumbnail");
                }       
            }     
        }
    }
}

  

现在 .NET Core 上有很多很棒的图像处理选项!重要的是要了解此 System.Drawing 层非常适合现有的 System.Drawing 代码,但您可能不应该用它编写新的图像管理代码。相反,请考虑其他优秀的开源选项之一。

  • ImageSharp - 用于处理图像文件的跨平台库;用 C# 编写
    • System.DrawingImageSharp 相比,它能够开发出更灵活、更容易编码、并且更不容易出现内存泄漏的东西。系统范围的进程锁已经不复存在;ImageSharp 图像是线程安全的,并且在 Web 环境中得到完全支持。

以下是使用 ImageSharp 调整某些内容大小的方法:

using (Image<Rgba32> image = Image.Load("foo.jpg"))
{
    image.Mutate(x => x
         .Resize(image.Width / 2, image.Height / 2)
         .Grayscale());
    image.Save("bar.jpg"); // Automatic encoder selected based on extension.
}

  

  • Magick.NET - ImageMagick 之上的 .NET 库
  • SkiaSharp - Google 跨平台 Skia 库之上的 .NET 包装器