Programowe generowanie zasobów wizualnych jest kluczowym wymaganiem w wielu aplikacjach .NET, od renderowania raportów po stronie serwera i generowania miniatur po dynamiczne tworzenie wykresów oraz potoki znakowania wodnego. Chociaż System.Drawing służył programistom .NET przez lata, ma dobrze znane ograniczenia: nie jest bezpieczny wątkowo, działa słabo pod obciążeniem i jest oficjalnie nieobsługiwany na platformach nie‑Windows w .NET 6+.

Aspose.Drawing for .NET jest gotowym, wieloplatformowym zamiennikiem, który zapewnia szybszy potok renderowania, wątkowo‑bezpieczne API oraz natywną obsługę BMP, PNG, JPEG, GIF, TIFF i innych — wszystko bez zewnętrznych kodeków ani zależności GDI+.

Ten przewodnik przeprowadzi Cię przez wszystko, co potrzebne do tworzenia i rysowania na bitmapach w C# przy użyciu Aspose.Drawing: konfigurację projektu, rysowanie kształtów i tekstu, zarządzanie pamięcią, optymalizację wydajności oraz najlepsze praktyki produkcyjne.

Tworzenie i rysowanie na bitmapach przy użyciu Aspose.Drawing for .NET

Wymagania wstępne

  • .NET 6.0 lub nowszy (Visual Studio 2022 lub JetBrains Rider zalecane)
  • NuGet package manager lub .NET CLI

1. Zainstaluj za pomocą konsoli Menedżera pakietów NuGet

Install-Package Aspose.Drawing

Lub używając .NET CLI:

dotnet add package Aspose.Drawing

Alternatywnie, pobierz najnowsze pliki binarne bezpośrednio ze strony wydań i odwołaj się do biblioteki DLL ręcznie.

2. Zastosuj licencję

Bez licencji biblioteka działa w trybie ewaluacyjnym, co dodaje znak wodny do wyjściowych obrazów. Do użytku produkcyjnego załaduj swoją licencję podczas uruchamiania aplikacji:

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

Uzyskaj darmową tymczasową licencję do nieograniczonej oceny. Pełne ceny są dostępne na stronie cenowej.

Krok po kroku: Tworzenie i rysowanie na bitmapie

Krok 1 — Utwórz obiekt Bitmap
Utwórz Bitmap o wymaganej szerokości, wysokości i formacie pikseli. PixelFormat.Format32bppArgb jest zalecany do ogólnego użytku — obsługuje pełną przezroczystość alfa i jest najbardziej kompatybilnym formatem we wszystkich typach wyjściowych.

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

Krok 2 — Uzyskaj powierzchnię graficzną
Wywołaj bitmap.GetGraphics(), aby otrzymać obiekt Graphics. Wszystkie operacje rysowania są wykonywane za pośrednictwem tego obiektu. Utrzymuj jedną instancję Graphics przez całą sesję rysowania — tworzenie i usuwanie wielu instancji na tym samym bitmapie jest nieefektywne.

using Graphics graphics = bitmap.GetGraphics();

Krok 3 — Wyczyść tło
Zawsze zaczynaj od wywołania Clear() w sposób jawny. Bez tego początkowy stan pikseli bitmapy jest niezdefiniowany i może zawierać szumy, szczególnie gdy ten sam bufor jest ponownie używany w kolejnych żądaniach.

graphics.Clear(Color.White);

Krok 4 — Rysowanie kształtów i tekstu
Użyj bogatego zestawu prymitywów rysowania: DrawRectangle, FillEllipse, DrawLine, DrawString i innych. Zmierz tekst przed jego umieszczeniem, aby uzyskać precyzyjne wyrównanie.

Krok 5 — Zapis i zwolnienie zasobów
Zapisz bitmapę na dysku przy użyciu bitmap.Save(), określając docelowy ImageFormat. Umieść wszystkie obiekty wymagające zwolnienia w blokach using, aby zapewnić czyszczenie zasobów.

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

Pełny przykład kodu C#

Poniższa aplikacja konsolowa demonstruje pełny przepływ pracy: tworzenie bitmapy, wypełnianie tła, rysowanie kształtów, renderowanie wyśrodkowanego tekstu oraz zapisywanie do formatu 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");
        }
    }
}

Przed wdrożeniem do produkcji: Zaktualizuj "DemoOutput.png" do ścieżki bezwzględnej lub rozwiązanej w środowisku. Zastosuj swoją licencję przed jakąkolwiek operacją rysowania. Przetestuj wszystkie docelowe formaty wyjściowe. Zobacz oficjalną dokumentację lub forum wsparcia w celu uzyskania pomocy.

FAQ

P: Jak utworzyć i rysować na bitmapie przy użyciu Aspose.Drawing w C#?
Utwórz Bitmap z szerokością, wysokością i PixelFormat, wywołaj bitmap.GetGraphics(), aby uzyskać powierzchnię Graphics, użyj metod rysowania takich jak DrawRectangle, FillEllipse i DrawString, a następnie zapisz przy użyciu bitmap.Save(). Pełny przykład kodu powyżej obejmuje cały przepływ pracy.

Q: Jakie formaty obrazu obsługuje Aspose.Drawing przy zapisywaniu?
BMP, PNG, JPEG, GIF, TIFF i kilka innych. Określ format za pomocą wyliczenia ImageFormat przy wywoływaniu Save() — na przykład ImageFormat.Jpeg lub ImageFormat.Tiff. Nie są wymagane zewnętrzne kodeki.

P: Jak zapobiec wyciekom pamięci przy przetwarzaniu dużej liczby obrazów?
Umieść każdy Bitmap, Graphics, Pen, Brush i Font w bloku using. Używaj ponownie obiektu Graphics do wszystkich rysunków na pojedynczym bitmapie, zamiast tworzyć wiele instancji. Unikaj niepotrzebnych wywołań Clone().

Q: Czy Aspose.Drawing jest bezpieczny wątkowo dla przetwarzania równoległego?
Tak, na poziomie bitmapy. Każda instancja Bitmap jest niezależna i może być przetwarzana w osobnym wątku. Nie udostępniaj jednej instancji Bitmap ani Graphics pomiędzy wątkami bez zewnętrznej synchronizacji.

Q: Jak precyzyjnie wyśrodkować tekst na bitmapie?
Użyj graphics.MeasureString(text, font), aby uzyskać renderowany SizeF swojego ciągu znaków, a następnie oblicz lewy górny PointF jako ((bitmapWidth - textWidth) / 2, (bitmapHeight - textHeight) / 2). Działa to poprawnie dla dowolnego rozmiaru czcionki, wagi lub długości ciągu.

Q: Czy mogę używać Aspose.Drawing na Linuxie lub macOS w projekcie .NET 6+?
Tak — jest to jedna z głównych zalet Aspose.Drawing w porównaniu z System.Drawing. Biblioteka jest w pełni wieloplatformowa i nie wymaga natywnych zależności GDI+.

Podsumowanie

Aspose.Drawing for .NET zapewnia programistom C# gotowe do produkcji, wieloplatformowe API do rysowania bitmap, które usuwa ograniczenia platformowe i problemy z bezpieczeństwem wątków w System.Drawing. Dzięki mniej niż 30 wierszom kodu możesz utworzyć bitmapę, renderować kształty i tekst z antyaliasingiem oraz zapisać ją w dowolnym popularnym formacie obrazu.

Zastosuj wzorce zarządzania zasobami i strategie przetwarzania wsadowego opisane w tym przewodniku przy budowaniu potoków obrazów w dużej skali. W celu oceny, pobierz bezpłatną tymczasową licencję. Pełne informacje o cenach znajdują się na stronie cenowej.

Czytaj więcej

Masz pytania lub uwagi? Odwiedź forum wsparcia Aspose.Drawing.