繪製光柵和向量圖像

無論您是建立網站、桌面應用程式還是行動應用程序,操作和繪製圖像的能力都是處理和編輯圖像時的關鍵方面。為了讓開發人員能夠獲得先進且易於實現的繪圖功能,我們引入了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,影像操作觸手可及,讓您能夠以程式設計方式創建引人注目且視覺上令人驚嘆的圖形。

讓我們知道您在我們的論壇上的回饋或疑問。