绘制光栅和矢量图像

无论您是构建网站、桌面应用程序还是移动应用程序,操作和绘制图像的能力都是处理和编辑图像时的一个关键方面。为了使开发人员能够获得先进且易于实现的绘图功能,我们引入了 Aspose.Imaging.Drawing,这是一个专为 C# .NET 应用程序设计的强大 API,提供了一系列图像绘图功能。

C# .NET 绘图库

Aspose.Imaging.Drawing 是一个强大的 API,允许您使用先进的图像处理技术处理光栅和矢量图像。通过本机字节访问,该 API 可确保创建或操作图像时的高处理速度。使用 API,您可以使用像素操作和图形路径绘制对象,并将图像从一种格式转换为另一种格式。 Aspose.Imaging.Drawing 使用 Aspose.Drawing 作为默认图形引擎,它是一个跨平台的 2D 图形库,提供了一整套用于绘制文本、几何图形和图像的功能,无需任何外部依赖。

您可以从 NuGet 下载并安装 Aspose.Imaging.Drawing。

PM> NuGet\Install-Package Aspose.Imaging.Drawing

现在让我们在源代码的帮助下看看这个 .NET 绘图 API 的一些显着功能及其用法。

使用 .NET 绘图库创建图形

Aspose.Imaging.Drawing 允许您通过绘制不同的对象(例如圆形、直线、三角形、正方形和椭圆形)来创建图像。不仅可以生成光栅图像,还可以使用 API 生成矢量图像。让我们看看如何使用此 .NET 绘图 API 在 C# 中绘制光栅和矢量图像。

绘制光栅图像

以下是使用 Aspose.Imaging.Drawing API 绘制光栅图像的步骤。

  • 首先,使用 Image.Create() 方法创建所需格式的图像。
  • 然后,创建一个 Graphics 类的对象,并使用我们上面创建的 Image 对其进行初始化。
  • 使用 Graphics.Clear 方法清除图像的表面。
  • 创建一支新笔并使用所需的颜色对其进行初始化。
  • 使用 Graphics.DrawEllipse() 方法绘制椭圆(或任何其他图形对象)。
  • 使用 Graphics.FillPolygon() 方法绘制多边形。
  • 最后,使用 Image.Save() 方法保存图像。

以下代码片段展示了如何在 C# 中绘制图像。

string outputFolder = @"Output\";

// 创建 BmpOptions 的实例并设置其各种属性
BmpOptions imageOptions = new BmpOptions();
imageOptions.BitsPerPixel = 24;

// 创建 FileCreateSource 的实例并将其分配给 Source 属性 
imageOptions.Source = new FileCreateSource(outputFolder + "result.bmp", false);

using (var image = Image.Create(imageOptions, 500, 500))
{
    var graphics = new Graphics(image);

    // 使用白色清除图像表面并使用蓝色创建并初始化 Pen 对象
    graphics.Clear(Color.White);
    var pen = new Pen(Color.Blue);

    // 通过定义宽度为 150、高度为 100 的边界矩形来绘制椭圆形,还可以使用 LinearGradientBrush 绘制多边形
    graphics.DrawEllipse(pen, new Rectangle(10, 10, 150, 100));

    using (var linearGradientBrush = new LinearGradientBrush(image.Bounds, Color.Red, Color.White, 45f))
    {
        graphics.FillPolygon(linearGradientBrush, new[] { new Point(200, 200), new Point(400, 200), new Point(250, 350) });
    }

    // 保存图片
    image.Save();
}

绘制矢量图像

与光栅图像类似,您可以通过几个简单的步骤绘制矢量图形,例如 SVG。让我们使用 C# 绘图库创建一个矢量图像。

  • 首先,创建一个 MemoryStream 对象。
  • 然后,加载 SVG 图像。
  • 将 SVG 栅格化为 PNG 并将结果写入流。
  • 从流中加载 PNG 图像以进行进一步绘制。
  • 在现有 SVG 图像上绘制 PNG 图像。
  • 最后,保存结果。

以下代码片段展示了如何在 C# 中绘制矢量图像。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (MemoryStream drawnImageStream = new MemoryStream())
{
    // 首先,将 Svg 光栅化为 Png 并将结果写入流。
    using (SvgImage svgImage = (SvgImage)Image.Load(templatesFolder + "template.svg"))
    {
        SvgRasterizationOptions rasterizationOptions = new SvgRasterizationOptions();
        rasterizationOptions.PageSize = svgImage.Size;

        PngOptions saveOptions = new PngOptions();
        saveOptions.VectorRasterizationOptions = rasterizationOptions;

        svgImage.Save(drawnImageStream, saveOptions);

        // 现在从流中加载 Png 图像以进行进一步绘制。
        drawnImageStream.Seek(0, System.IO.SeekOrigin.Begin);
        using (RasterImage imageToDraw = (RasterImage)Image.Load(drawnImageStream))
        {
            // 利用现有的 Svg 图像进行绘制。
            Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D graphics = new Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D(svgImage);

            // 将整个绘制图像缩小2倍,并将其绘制到绘图表面的中心。
            int width = imageToDraw.Width / 2;
            int height = imageToDraw.Height / 2;
            Point origin = new Point((svgImage.Width - width) / 2, (svgImage.Height - height) / 2);
            Size size = new Size(width, height);

            graphics.DrawImage(imageToDraw, origin, size);

            // 保存结果图像
            using (SvgImage resultImage = graphics.EndRecording())
            {
                resultImage.Save(outputFolder + "vector_image.svg");
            }
        }
    }
}

对图像应用遮罩

图像编辑中的遮罩是指有选择地隐藏或显示图像的某些部分的技术。它涉及创建一个蒙版,该蒙版本质上是一个灰度图像,用于定义原始图像中每个像素的透明度或不透明度。图像掩蔽广泛应用于识别和诊断。

Aspose.Image.Drawing 提供了两种应用图像遮罩的方法:

  • 手动遮罩 - 它使用一组 ROI 作为遮罩。每个切片的 ROI 用于定义掩模。它需要额外的用户输入。
  • 自动屏蔽 - 它不需要用户输入大量数据,但可能不太准确。

现在让我们看看如何在 C# 代码中对图像应用手动和自动遮罩。

手动图像遮蔽

以下代码片段展示了如何在 C# 中对图像应用手动遮罩。

string outputFolder = @"Output\";

// 源文件
string sourceFileName = outputFolder + "couple.png";

// 创建图形路径
GraphicsPath manualMask = new GraphicsPath();

// 添加形状
Figure firstFigure = new Figure();
firstFigure.AddShape(new EllipseShape(new RectangleF(100, 30, 40, 40)));
firstFigure.AddShape(new RectangleShape(new RectangleF(10, 200, 50, 30)));

// 添加图
manualMask.AddFigure(firstFigure);

GraphicsPath subPath = new GraphicsPath();
Figure secondFigure = new Figure();
secondFigure.AddShape(
    new PolygonShape(
     new PointF[]
     {
        new PointF(310, 100), new PointF(350, 200), new PointF(250, 200)

     }, true));

secondFigure.AddShape(new PieShape(new RectangleF(10, 10, 80, 80), 30, 120));
subPath.AddFigure(secondFigure);
manualMask.AddPath(subPath);

// 应用遮蔽
using (RasterImage image = (RasterImage)Image.Load(sourceFileName))
{
    MaskingOptions maskingOptions = new MaskingOptions()
    {
        Method = SegmentationMethod.Manual,
        Args = new ManualMaskingArgs
        {
            Mask = manualMask
        },
        Decompose = false,
        ExportOptions =
      new PngOptions()
      {
          ColorType = PngColorType.TruecolorWithAlpha,
          Source = new StreamSource(new MemoryStream())
      },
    };
    MaskingResult results = new ImageMasking(image).Decompose(maskingOptions);
    // 保存最终的遮蔽结果。
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "manual_masking.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

自动图像遮蔽

下面的代码片段使用 .NET 绘图 API 在图像上应用自动遮罩。

string outputFolder = @"Output\";

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(outputFolder + "couple.jpg"))
{
    // 要将 Graph Cut 与自动计算笔划结合使用,请使用 AutoMaskingGraphCutOptions。
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // 指示在图像分解期间应执行默认笔划的新计算。
        CalculateDefaultStrokes = true,
        
        // 根据图像大小设置后处理羽化半径。
        FeatheringRadius = (Math.Max(image.Width, image.Height) / 500) + 1,
        Method = SegmentationMethod.GraphCut,
        Decompose = false,
        ExportOptions =
            new PngOptions()
            {
                ColorType = PngColorType.TruecolorWithAlpha,
                Source = new FileCreateSource(outputFolder + "auto_masking.png")
            },
        BackgroundReplacementColor = Color.Transparent
    };

    results = new ImageMasking(image).Decompose(options);

    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "auto_masking_2.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

将滤镜应用于图像

将滤镜应用于图像有多种目的,人们使用它们的原因也多种多样,既有实用的,也有艺术的。图像滤镜最常见的用途包括色彩校正、增强图像质量、应用特效、降噪等。 Aspose.Imaging.Drawing 支持多种类型的滤镜,您可以将其应用于图像,例如中值、运动韦纳、高斯韦纳等。

为了进行演示,请查看以下代码,该代码使用 Aspose.Imaging.Drawing 将中值滤波器应用于图像。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// 加载有噪声的图像 
using (Image image = Image.Load(templatesFolder + "template.gif"))
{
    // 将图像转换为 RasterImage
    RasterImage rasterImage = image as RasterImage;
    if (rasterImage == null)
    {
        return;
    }

    // 创建 MedianFilterOptions 类的实例并设置大小,将 MedianFilterOptions 滤镜应用于 RasterImage 对象并保存结果图像
    MedianFilterOptions options = new MedianFilterOptions(4);
    rasterImage.Filter(image.Bounds, options);

    // 保存图片
    image.Save(outputFolder + "median_filter.gif");
}

裁剪、旋转和调整图像大小

裁剪、旋转和调整图像大小被认为是图像编辑应用程序的基本功能。它们是用于操纵数字图像的最常见的图像处理操作。让我们看看如何使用 Aspose.Imaging.Drawing API 裁剪、旋转和调整图像大小。

裁剪图像

要裁剪图像,您需要提供图像所有四个边的移位值。根据这些值,图像边界向图像中心移动。以下 C# 代码片段根据提供的移位值裁剪图像。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// 将现有图像加载到 RasterImage 类的实例中
using (RasterImage rasterImage = (RasterImage)Image.Load(templatesFolder + "template.jpg"))
{
    // 在裁剪之前,应该缓存图像以获得更好的性能
    if (!rasterImage.IsCached)
    {
        rasterImage.CacheData();
    }

    // 定义所有四个边的位移值
    int leftShift = 10;
    int rightShift = 10;
    int topShift = 10;
    int bottomShift = 10;

    // 根据偏移值,对图像应用裁剪 裁剪方法会将图像边界向图像中心移动并将结果保存到磁盘
    rasterImage.Crop(leftShift, rightShift, topShift, bottomShift);

    // 保存裁剪后的图像
    rasterImage.Save(outputFolder + "cropped_image.jpg");
}

旋转图像

为了旋转图像,Aspose.Imaging.Drawing 提供了 RotateFlip 方法,该方法不仅可以旋转图像,还可以翻转图像(如果需要)。您可以从 RotateFlipType 枚举中选择所需的旋转和翻转选项。以下代码片段展示了如何在 C# 中旋转图像但不翻转图像。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// 加载和旋转图像
using (var image = Image.Load(templatesFolder + "template.jpg"))
{
    // 旋转图像
    image.RotateFlip(RotateFlipType.Rotate270FlipNone);

    // 保存图片
    image.Save(outputFolder + "rotated_image.jpg");
}

调整图像大小

使用 Aspose.Imaging.Drawing 调整图像大小就像做馅饼一样简单。只需调用 Resize 方法并传递新的高度和宽度值即可。以下代码片段展示了如何在 C# 中调整图像大小。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (Image image = Image.Load(templatesFolder + "template.jpg"))
{
    // 调整图像大小
    image.Resize(300, 300);

    // 保存图片
    image.Save(outputFolder + "resized_image.jpg");
}   

将图像转换为其他格式

要使用 Aspose.Imaging.Drawing API 转换图像,您只需加载图像并将其保存为所需的输出格式。以下代码片段将 JPG 图像转换为 WebP、PSD、PDF 和 TIFF 格式。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (var img = Aspose.Imaging.Image.Load(templatesFolder + "template.jpg"))
{
    // 保存为不同的图像格式
    img.Save(outputFolder + "output.webp", new Aspose.Imaging.ImageOptions.WebPOptions());
    img.Save(outputFolder + "output.psd ", new Aspose.Imaging.ImageOptions.PsdOptions());
    img.Save(outputFolder + "output.tiff", new Aspose.Imaging.ImageOptions.TiffOptions(TiffExpectedFormat.Default));

    // 另存为 PDF
    PdfOptions exportOptions = new PdfOptions();
    exportOptions.PdfDocumentInfo = new Aspose.Imaging.FileFormats.Pdf.PdfDocumentInfo();
    img.Save(outputFolder + "output.pdf", exportOptions);
}

获取免费的 API 许可证

如果您想评估 Aspose.Imaging.Drawing API,您可以获得免费的临时许可证,它可以让您不受任何限制地充分使用 API。

结论

在图形和图像处理领域,Aspose.Imaging.Drawing API 是 C# .NET 开发人员的多功能且强大的工具。无论您是希望增强视觉元素、纠正图像失真还是在格式之间转换图像,此 API 都提供了一套全面的功能。借助 Aspose.Imaging.Drawing,图像处理触手可及,使您能够以编程方式创建引人注目且视觉上令人惊叹的图形。

让我们知道您在我们的论坛上的反馈或疑问。