以程式方式產生視覺資產是許多 .NET 應用程式的核心需求,從伺服器端報表渲染與縮圖產生到動態圖表建立與浮水印流程皆是如此。雖然 System.Drawing 多年來一直為 .NET 開發人員所使用,但它存在眾所周知的限制:它不是執行緒安全的,在負載下表現不佳,且在 .NET 6+ 中正式不支援非 Windows 平台。

Aspose.Drawing for .NET 是即插即用、跨平台的替代方案,提供更快的渲染管線、線程安全的 API,並原生支援 BMP、PNG、JPEG、GIF、TIFF 等格式——全部無需外部編解碼器或 GDI+ 依賴。

本指南將帶您了解在 C# 中使用 Aspose.Drawing 創建和繪製位圖所需的全部內容:項目設置、繪製形狀和文字、內存管理、性能調優以及生產最佳實踐。

使用 Aspose.Drawing for .NET 建立並繪製位圖

先決條件

  • .NET 6.0 或更高版本(建議使用 Visual Studio 2022 或 JetBrains Rider)
  • NuGet 套件管理員或 .NET CLI

1. 透過 NuGet 套件管理員主控台安裝

Install-Package Aspose.Drawing

或者使用 .NET CLI:

dotnet add package Aspose.Drawing

或者,直接從發行頁面下載最新的二進位檔,並手動引用 DLL。

2. 套用授權

如果沒有授權,庫將以評估模式運行,會在輸出圖像上添加水印。對於生產環境,請在應用程式啟動時載入您的授權:

new Aspose.Drawing.License().SetLicense("Aspose.Drawing.lic");

取得免費臨時許可證以進行無限制的評估。完整的定價資訊請參閱定價頁面

逐步說明:建立並在位圖上繪圖

第 1 步 — 建立 Bitmap
建立一個具有所需寬度、高度和像素格式的 BitmapPixelFormat.Format32bppArgb 建議用於一般情況 —— 它支援完整的 alpha 透明度,且是最相容於各種輸出類型的格式。

var bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb);

第 2 步 — 獲取圖形表面
呼叫 bitmap.GetGraphics() 以取得 Graphics 物件。所有繪圖操作皆透過此物件執行。請在整個繪圖會話期間保持單一的 Graphics 實例存活——在同一位圖上建立並釋放多個實例會浪費資源。

using Graphics graphics = bitmap.GetGraphics();

第 3 步 — 清除背景
始終以顯式的 Clear() 呼叫開始。若省略此步驟,位圖的初始像素狀態未定義,可能包含噪點,尤其在同一緩衝區於多個請求間重複使用時。

graphics.Clear(Color.White);

第4步 — 繪製形狀和文字
使用豐富的繪圖基元集合:DrawRectangleFillEllipseDrawLineDrawString,以及其他。測量文字以在放置前實現精確對齊。

第5步 — 保存與釋放
使用 bitmap.Save() 將位圖寫入磁碟,並指定目標 ImageFormat。將所有可釋放的物件放入 using 區塊中,以確保資源清理。

bitmap.Save("output.png", ImageFormat.Png);

完整的 C# 程式碼範例

以下控制台應用程式示範了完整的工作流程:位圖建立、背景填充、形狀繪製、居中文本渲染,以及保存為 PNG。

using System;
using Aspose.Drawing;
using Aspose.Drawing.Imaging;
using Aspose.Drawing.Drawing2D;

namespace BitmapDemo
{
    class Program
    {
        static void Main()
        {
            // 1. Create an 800x600 bitmap with 32-bit ARGB pixel format
            using (Bitmap bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb))
            {
                // 2. Obtain a Graphics surface — keep one instance for all operations
                using (Graphics graphics = bitmap.GetGraphics())
                {
                    // 3. Fill background — never skip this; uninitialized pixels cause visual noise
                    graphics.Clear(Color.White);

// 4. Draw a blue rectangle border (5px stroke)
                    using (Pen bluePen = new Pen(Color.Blue, 5))
                    {
                        graphics.DrawRectangle(bluePen, new Rectangle(100, 100, 600, 400));
                    }

// 5. Fill a red ellipse inside the rectangle
                    using (Brush redBrush = new SolidBrush(Color.Red))
                    {
                        graphics.FillEllipse(redBrush, new Rectangle(200, 150, 400, 300));
                    }

// 6. Render centered text using MeasureString for precise placement
                    using (Font font = new Font("Arial", 36, FontStyle.Bold))
                    using (Brush blackBrush = new SolidBrush(Color.Black))
                    {
                        string text = "Aspose.Drawing Demo";

// MeasureString returns the rendered text bounds at this font/size
                        SizeF textSize = graphics.MeasureString(text, font);

PointF location = new PointF(
                            (bitmap.Width  - textSize.Width)  / 2f,
                            (bitmap.Height - textSize.Height) / 2f
                        );

graphics.DrawString(text, font, blackBrush, location);
                    }
                }

// 7. Save as PNG — change ImageFormat to Jpeg, Bmp, Tiff, etc. as needed
                bitmap.Save("DemoOutput.png", ImageFormat.Png);
            }

Console.WriteLine("✓ Bitmap saved as DemoOutput.png");
        }
    }
}

在部署到生產環境之前: 更新 "DemoOutput.png" 為絕對路徑或環境解析路徑。 在任何繪圖操作之前套用您的授權。 在所有目標輸出格式上進行測試。 請參閱官方文件支援論壇以獲得協助。

常見問題

Q: 如何在 C# 中使用 Aspose.Drawing 建立並在位圖上繪圖?
實例化一個具有寬度、高度和 PixelFormatBitmap,呼叫 bitmap.GetGraphics() 取得 Graphics 表面,使用如 DrawRectangleFillEllipseDrawString 等繪圖方法,最後使用 bitmap.Save() 儲存。上面的完整程式碼範例涵蓋了整個工作流程。

Q: Aspose.Drawing 支援哪些影像格式的儲存?
BMP、PNG、JPEG、GIF、TIFF,以及其他幾種。呼叫 Save() 時透過 ImageFormat 列舉指定格式,例如 ImageFormat.JpegImageFormat.Tiff。不需要外部編解碼器。

Q: 在處理大量圖像時,如何防止記憶體洩漏?
將每個 BitmapGraphicsPenBrushFont 包裝在 using 區塊中。對單一位圖的所有繪圖重複使用同一個 Graphics 物件,而不是建立多個實例。避免不必要的 Clone() 呼叫。

Q: Aspose.Drawing 在平行處理時是否執行緒安全?
是的,在 bitmap 級別是安全的。每個 Bitmap 實例都是獨立的,可以在不同執行緒上處理。不要在未進行外部同步的情況下共享單一的 BitmapGraphics 實例於多個執行緒。

Q: 如何在位圖上精確居中文本?
使用 graphics.MeasureString(text, font) 取得字串的渲染 SizeF,然後將左上角 PointF 計算為 ((bitmapWidth - textWidth) / 2, (bitmapHeight - textHeight) / 2)。此方法對任何字體大小、粗細或字串長度都能正確運作。

Q: 我可以在 .NET 6+ 專案中於 Linux 或 macOS 使用 Aspose.Drawing 嗎?
是的——這是 Aspose.Drawing 相較於 System.Drawing 的主要優勢之一。該庫完全跨平台,且不需要任何本機 GDI+ 相依性。

結論

Aspose.Drawing for .NET 為 C# 開發人員提供了一個可投入生產的跨平台位圖繪製 API,消除了 System.Drawing 的平台限制和執行緒安全問題。僅需不到 30 行程式碼,即可建立位圖、以抗鋸齒方式繪製形狀和文字,並儲存為任何主流影像格式。

在大規模構建圖像管道時,請在本指南中應用資源管理模式和批處理策略。評估時,獲取免費臨時許可證。完整的定價詳情請參閱定價頁面

閱讀更多

有任何問題或意見嗎?請造訪 Aspose.Drawing 支援論壇.