Kreslení rastrových a vektorových obrázků

Ať už vytváříte web, desktopovou aplikaci nebo mobilní aplikaci, schopnost manipulovat s obrázky a kreslit na ně je zásadním aspektem při zpracování a úpravě obrázků. Abychom vývojářům umožnili pokročilé, ale snadno implementovatelné funkce kreslení, představujeme Aspose.Imaging.Drawing, výkonné API navržené pro aplikace C# .NET, které nabízí řadu funkcí pro kreslení obrázků.

Knihovna výkresů C# .NET

Aspose.Imaging.Drawing je robustní API, které umožňuje zpracovávat rastrové a vektorové obrázky pomocí pokročilých technik zpracování obrázků. S nativním bajtovým přístupem API zajišťuje vysokou rychlost zpracování při vytváření nebo manipulaci s obrázky. Pomocí API můžete kreslit objekty s manipulací s pixely a grafickou cestou a převádět obrázky z jednoho formátu do druhého. Aspose.Imaging.Drawing používá Aspose.Drawing jako výchozí grafický engine, což je multiplatformní 2D grafická knihovna, která nabízí kompletní sadu funkcí pro kreslení textu, geometrií a obrázků bez jakýchkoliv externích závislostí.

Aspose.Imaging.Drawing si můžete stáhnout a nainstalovat z NuGet.

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

Podívejme se nyní na některé hlavní funkce tohoto .NET Drawing API a jejich použití pomocí zdrojového kódu.

Vytváření grafiky pomocí .NET Drawing Library

Aspose.Imaging.Drawing umožňuje vytvářet obrázky kreslením různých objektů, jako jsou kruhy, čáry, trojúhelníky, čtverce a elipsy. Nejen rastrové obrázky, ale můžete generovat vektorové obrázky pomocí API. Pojďme se podívat na to, jak kreslit rastrové a vektorové obrázky v C# pomocí tohoto rozhraní API pro kreslení .NET.

Nakreslete rastrový obrázek

Níže jsou uvedeny kroky pro kreslení rastrového obrázku pomocí Aspose.Imaging.Drawing API.

  • Nejprve vytvořte obraz požadovaného formátu pomocí metody Image.Create().
  • Poté vytvořte objekt třídy Graphics a inicializujte jej pomocí Image, který jsme vytvořili výše.
  • Vyčistěte povrch obrázku pomocí metody Graphics.Clear.
  • Vytvořte nové pero a inicializujte jej požadovanou barvou.
  • Nakreslete elipsu (nebo jakýkoli jiný grafický objekt) pomocí metody Graphics.DrawEllipse().
  • Nakreslete mnohoúhelník pomocí metody Graphics.FillPolygon().
  • Nakonec uložte obrázek pomocí metody Image.Save().

Následující fragment kódu ukazuje, jak nakreslit obrázek v C#.

string outputFolder = @"Output\";

// Vytvořte instanci BmpOptions a nastavte její různé vlastnosti
BmpOptions imageOptions = new BmpOptions();
imageOptions.BitsPerPixel = 24;

// Vytvořte instanci FileCreateSource a přiřaďte ji vlastnosti Source 
imageOptions.Source = new FileCreateSource(outputFolder + "result.bmp", false);

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

    // Vyčistěte povrch obrázku bílou barvou a vytvořte a inicializujte objekt Pen s modrou barvou
    graphics.Clear(Color.White);
    var pen = new Pen(Color.Blue);

    // Nakreslete elipsu definováním ohraničujícího obdélníku o šířce 150 a výšce 100 také Nakreslete mnohoúhelník pomocí 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) });
    }

    // Uložit obrázek
    image.Save();
}

Nakreslete vektorový obrázek

Podobně jako u rastrových obrázků můžete kreslit vektorovou grafiku, například SVG, v několika jednoduchých krocích. Vytvořme vektorový obrázek pomocí naší kreslicí knihovny C#.

  • Nejprve vytvořte objekt MemoryStream.
  • Poté načtěte obrázek SVG.
  • Rastrujte SVG na PNG a zapište výsledek do streamu.
  • Načtěte obrázek PNG ze streamu pro další kreslení.
  • Nakreslete obrázek PNG na existující obrázek SVG.
  • Nakonec výsledky uložte.

Následující fragment kódu ukazuje, jak nakreslit vektorový obrázek v C#.

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

using (MemoryStream drawnImageStream = new MemoryStream())
{
    // Nejprve rastrujte Svg na Png a výsledek zapište do streamu.
    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);

        // Nyní načtěte obrázek Png ze streamu pro další kreslení.
        drawnImageStream.Seek(0, System.IO.SeekOrigin.Begin);
        using (RasterImage imageToDraw = (RasterImage)Image.Load(drawnImageStream))
        {
            // Kreslení na existující obrázek Svg.
            Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D graphics = new Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D(svgImage);

            // Zmenšete celý nakreslený obrázek 2krát a nakreslete jej do středu kreslicí plochy.
            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);

            // Uložte výsledný obrázek
            using (SvgImage resultImage = graphics.EndRecording())
            {
                resultImage.Save(outputFolder + "vector_image.svg");
            }
        }
    }
}

Použít maskování na obrázky

Maskování při úpravách obrázků se týká techniky selektivního skrývání nebo odhalování určitých částí obrázku. Zahrnuje vytvoření masky, což je v podstatě obrázek ve stupních šedi, který definuje průhlednost nebo neprůhlednost každého pixelu v původním obrázku. Maskování obrazu je široce používáno pro rozpoznávání a diagnostiku.

Aspose.Image.Drawing poskytuje dva způsoby použití maskování obrazu:

  • Manuální maskování – Jako maska se používá sada oblastí zájmu. K definování masky se používají ROI pro každý řez. Vyžaduje další uživatelský vstup.
  • Automatické maskování – nevyžaduje od uživatele mnoho vstupních dat, ale nemusí být tak přesné.

Podívejme se nyní, jak aplikovat ruční a automatické maskování na obrázky v kódu C#.

Manuální maskování obrazu

Následující fragment kódu ukazuje, jak použít ruční maskování na obrázek v C#.

string outputFolder = @"Output\";

// Zdrojový soubor
string sourceFileName = outputFolder + "couple.png";

// Vytvořte grafickou cestu
GraphicsPath manualMask = new GraphicsPath();

// Přidejte tvary
Figure firstFigure = new Figure();
firstFigure.AddShape(new EllipseShape(new RectangleF(100, 30, 40, 40)));
firstFigure.AddShape(new RectangleShape(new RectangleF(10, 200, 50, 30)));

// Přidejte obrázek
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);

// Naneste maskování
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);
    // Uložení konečného výsledku maskování.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "manual_masking.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

Automatické maskování obrazu

Níže uvedený fragment kódu aplikuje automatické maskování na obrázek pomocí rozhraní API pro kreslení .NET.

string outputFolder = @"Output\";

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(outputFolder + "couple.jpg"))
{
    // Chcete-li použít Graph Cut s automaticky vypočítanými tahy, použije se AutoMaskingGraphCutOptions.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // Indikuje, že během rozkladu obrazu by měl být proveden nový výpočet výchozích tahů.
        CalculateDefaultStrokes = true,
        
        // Nastavení poloměru prolnutí po zpracování na základě velikosti obrázku.
        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 });
    }
}

Použít filtry na obrázky

Použití filtrů na obrázky slouží různým účelům a lidé je používají z různých důvodů, praktických i uměleckých. Mezi nejběžnější použití obrazových filtrů patří korekce barev, vylepšení kvality obrazu, použití speciálních efektů, redukce šumu a tak dále. Aspose.Imaging.Drawing podporuje několik typů filtrů, které můžete na obrázky použít, jako je medián, pohyb weiner, gauss weiner atd.

Pro demonstraci se podívejte na následující kód, který aplikuje mediánový filtr na obrázek pomocí Aspose.Imaging.Drawing.

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

// Načtěte zašuměný obraz 
using (Image image = Image.Load(templatesFolder + "template.gif"))
{
    // Přeneste obrázek do RasterImage
    RasterImage rasterImage = image as RasterImage;
    if (rasterImage == null)
    {
        return;
    }

    // Vytvořte instanci třídy MedianFilterOptions a nastavte velikost, použijte filtr MedianFilterOptions na objekt RasterImage a uložte výsledný obrázek
    MedianFilterOptions options = new MedianFilterOptions(4);
    rasterImage.Filter(image.Bounds, options);

    // Uložit obrázek
    image.Save(outputFolder + "median_filter.gif");
}

Oříznout, otočit a změnit velikost obrázků

Oříznutí, otočení a změna velikosti obrázků jsou považovány za základní funkce aplikací pro úpravu obrázků. Jsou to nejběžnější operace zpracování obrazu, které se používají k manipulaci s digitálními obrazy. Pojďme se podívat na to, jak oříznout, otočit a změnit velikost obrázků pomocí Aspose.Imaging.Drawing API.

Oříznout obrázek

Chcete-li obrázek oříznout, musíte zadat hodnoty posunu pro všechny čtyři strany obrázku. Na základě těchto hodnot se hranice obrazu posunou směrem ke středu obrazu. Následující fragment kódu C# ořízne obrázek na základě zadaných hodnot posunu.

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

// Načtěte existující obrázek do instance třídy RasterImage
using (RasterImage rasterImage = (RasterImage)Image.Load(templatesFolder + "template.jpg"))
{
    // Před oříznutím by měl být obrázek pro lepší výkon uložen do mezipaměti
    if (!rasterImage.IsCached)
    {
        rasterImage.CacheData();
    }

    // Definujte hodnoty posunu pro všechny čtyři strany
    int leftShift = 10;
    int rightShift = 10;
    int topShift = 10;
    int bottomShift = 10;

    // Na základě hodnot posunu použijte metodu oříznutí obrázku. Oříznutí posune hranice obrázku směrem ke středu obrázku a uloží výsledky na disk
    rasterImage.Crop(leftShift, rightShift, topShift, bottomShift);

    // Uložit oříznutý obrázek
    rasterImage.Save(outputFolder + "cropped_image.jpg");
}

Otočit obrázek

Pro otočení obrázku poskytuje Aspose.Imaging.Drawing metodu RotateFlip, která nejen otáčí obrázek, ale také jej převrací (v případě potřeby). Z výčtu RotateFlipType si můžete vybrat požadovanou možnost otočení a převrácení. Následující fragment kódu ukazuje, jak otočit obrázek, ale nepřevrátit jej v C#.

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

// Načítání a otáčení obrázku
using (var image = Image.Load(templatesFolder + "template.jpg"))
{
    // Otočit obrázek
    image.RotateFlip(RotateFlipType.Rotate270FlipNone);

    // Uložit obrázek
    image.Save(outputFolder + "rotated_image.jpg");
}

Změna velikosti obrázku

Změna velikosti obrázku pomocí Aspose.Imaging.Drawing je jednoduchá jako koláč. Stačí zavolat metodu Resize a předat nové hodnoty výšky a šířky. Následující fragment kódu ukazuje, jak změnit velikost obrázku v C#.

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

using (Image image = Image.Load(templatesFolder + "template.jpg"))
{
    // Změnit velikost obrázku
    image.Resize(300, 300);

    // Uložit obrázek
    image.Save(outputFolder + "resized_image.jpg");
}   

Převést obrázky do jiných formátů

Chcete-li převést obrázek pomocí Aspose.Imaging.Drawing API, stačí obrázek načíst a uložit v požadovaném výstupním formátu. Následující fragment kódu převede obrázek JPG do formátů WebP, PSD, PDF a TIFF.

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

using (var img = Aspose.Imaging.Image.Load(templatesFolder + "template.jpg"))
{
    // Uložit v různých formátech obrázků
    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));

    // Uložit jako PDF
    PdfOptions exportOptions = new PdfOptions();
    exportOptions.PdfDocumentInfo = new Aspose.Imaging.FileFormats.Pdf.PdfDocumentInfo();
    img.Save(outputFolder + "output.pdf", exportOptions);
}

Získejte bezplatnou licenci API

Pokud chcete hodnotit Aspose.Imaging.Drawing API, můžete získat bezplatnou dočasnou licenci, která vám umožní využívat API v plném rozsahu bez jakýchkoli omezení.

Závěr

V oblasti grafiky a zpracování obrazu vyniká Aspose.Imaging.Drawing API jako všestranný a výkonný nástroj pro vývojáře v C# .NET. Ať už chcete vylepšit vizuální prvky, opravit zkreslení obrazu nebo převést obrázky mezi formáty, toto API poskytuje komplexní sadu funkcí. S Aspose.Imaging.Drawing máte manipulaci s obrázky na dosah ruky, což vám umožňuje vytvářet působivou a vizuálně ohromující grafiku programově.

Dejte nám vědět o své zpětné vazbě nebo dotazech na našem fóru.