Disegna immagini raster e vettoriali

Che tu stia creando un sito Web, un’applicazione desktop o un’app mobile, la capacità di manipolare e attingere alle immagini è un aspetto cruciale durante l’elaborazione e la modifica delle immagini. Per fornire agli sviluppatori funzionalità di disegno avanzate ma facili da implementare, presentiamo Aspose.Imaging.Drawing, una potente API progettata per applicazioni C# .NET, che offre una gamma di funzionalità di disegno di immagini.

Libreria di disegni C# .NET

Aspose.Imaging.Drawing è una solida API che consente di elaborare immagini raster e vettoriali con tecniche avanzate di elaborazione delle immagini. Con l’accesso byte nativo, l’API garantisce un’elevata velocità di elaborazione durante la creazione o la manipolazione delle immagini. Utilizzando l’API, puoi disegnare oggetti con manipolazione dei pixel e percorso grafico e convertire immagini da un formato all’altro. Aspose.Imaging.Drawing utilizza Aspose.Drawing come motore grafico predefinito, che è una libreria grafica 2D multipiattaforma che offre un set completo di funzionalità per disegnare testo, geometrie e immagini senza dipendenze esterne.

È possibile scaricare e installare Aspose.Imaging.Drawing da NuGet.

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

Diamo ora un’occhiata ad alcune caratteristiche salienti di questa API di disegno .NET e al loro utilizzo con l’aiuto del codice sorgente.

Creazione di grafica utilizzando la libreria di disegni .NET

Aspose.Imaging.Drawing ti consente di creare immagini disegnando diversi oggetti come cerchi, linee, triangoli, quadrati ed ellissi. Non solo le immagini raster ma puoi generare immagini vettoriali utilizzando l’API. Diamo un’occhiata a come disegnare immagini raster e vettoriali in C# utilizzando questa API di disegno .NET.

Disegna un’immagine raster

Di seguito sono riportati i passaggi per disegnare un’immagine raster utilizzando l’API Aspose.Imaging.Drawing.

  • Innanzitutto, crea un’immagine del formato desiderato utilizzando il metodo Image.Create().
  • Quindi, crea un oggetto della classe Graphics e inizializzalo con l’immagine che abbiamo creato sopra.
  • Cancella la superficie dell’immagine utilizzando il metodo Graphics.Clear.
  • Crea una nuova penna e inizializzala con il colore desiderato.
  • Disegna un’ellisse (o qualsiasi altro oggetto grafico) utilizzando il metodo Graphics.DrawEllipse().
  • Disegna un poligono utilizzando il metodo Graphics.FillPolygon().
  • Infine, salva l’immagine utilizzando il metodo Image.Save().

Il frammento di codice seguente mostra come disegnare un’immagine in C#.

string outputFolder = @"Output\";

// Crea un'istanza di BmpOptions e imposta le sue varie proprietà
BmpOptions imageOptions = new BmpOptions();
imageOptions.BitsPerPixel = 24;

// Crea un'istanza di FileCreateSource e assegnala alla proprietà Source 
imageOptions.Source = new FileCreateSource(outputFolder + "result.bmp", false);

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

    // Cancella la superficie dell'immagine con il colore bianco e crea e inizializza un oggetto Penna con il colore blu
    graphics.Clear(Color.White);
    var pen = new Pen(Color.Blue);

    // Disegna l'ellisse definendo il rettangolo di delimitazione di larghezza 150 e altezza 100. Disegna anche un poligono utilizzando 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) });
    }

    // Salva immagine
    image.Save();
}

Disegna un’immagine vettoriale

Analogamente alle immagini raster, puoi disegnare grafica vettoriale, come SVG, in pochi semplici passaggi. Creiamo un’immagine vettoriale utilizzando la nostra libreria di disegni C#.

  • Innanzitutto, crea un oggetto MemoryStream.
  • Quindi, carica un’immagine SVG.
  • Rasterizza SVG in PNG e scrivi il risultato in un flusso.
  • Carica un’immagine PNG dallo stream per ulteriori disegni.
  • Disegna un’immagine PNG su un’immagine SVG esistente.
  • Infine, salva i risultati.

Il frammento di codice seguente mostra come disegnare un’immagine vettoriale in C#.

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

using (MemoryStream drawnImageStream = new MemoryStream())
{
    // Innanzitutto, rasterizza Svg in Png e scrivi il risultato in un flusso.
    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);

        // Ora carica un'immagine Png dallo stream per ulteriori disegni.
        drawnImageStream.Seek(0, System.IO.SeekOrigin.Begin);
        using (RasterImage imageToDraw = (RasterImage)Image.Load(drawnImageStream))
        {
            // Attingendo all'immagine Svg esistente.
            Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D graphics = new Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D(svgImage);

            // Riduci l'intera immagine disegnata di 2 volte e disegnala al centro della superficie di disegno.
            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);

            // Salva l'immagine del risultato
            using (SvgImage resultImage = graphics.EndRecording())
            {
                resultImage.Save(outputFolder + "vector_image.svg");
            }
        }
    }
}

Applica mascheramento alle immagini

Il mascheramento nell’editing delle immagini si riferisce alla tecnica di nascondere o rivelare selettivamente alcune parti di un’immagine. Implica la creazione di una maschera, che è essenzialmente un’immagine in scala di grigi che definisce la trasparenza o l’opacità di ciascun pixel nell’immagine originale. Il mascheramento delle immagini è ampiamente praticato per il riconoscimento e la diagnostica.

Aspose.Image.Drawing fornisce due metodi per applicare il mascheramento dell’immagine:

  • Mascheramento manuale: utilizza una serie di ROI come maschera. Le ROI per ciascuna sezione vengono utilizzate per definire la maschera. Richiede ulteriore input da parte dell’utente.
  • Mascheramento automatico: non richiede molti dati di input da parte dell’utente ma potrebbe non essere così accurato.

Vediamo ora come applicare il mascheramento manuale e automatico sulle immagini in codice C#.

Mascheramento manuale delle immagini

Il frammento di codice seguente illustra come applicare il mascheramento manuale su un’immagine in C#.

string outputFolder = @"Output\";

// File sorgente
string sourceFileName = outputFolder + "couple.png";

// Crea percorso grafico
GraphicsPath manualMask = new GraphicsPath();

// Aggiungi forme
Figure firstFigure = new Figure();
firstFigure.AddShape(new EllipseShape(new RectangleF(100, 30, 40, 40)));
firstFigure.AddShape(new RectangleShape(new RectangleF(10, 200, 50, 30)));

// Aggiungi figura
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);

// Applicare il mascheramento
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);
    // Salvataggio del risultato finale del mascheramento.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "manual_masking.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

Mascheramento automatico dell’immagine

Il frammento di codice seguente applica il mascheramento automatico a un’immagine utilizzando l’API di disegno .NET.

string outputFolder = @"Output\";

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(outputFolder + "couple.jpg"))
{
    // Per utilizzare Taglio grafico con tratti calcolati automaticamente, viene utilizzato AutoMaskingGraphCutOptions.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // Indica che durante la scomposizione dell'immagine deve essere eseguito un nuovo calcolo dei tratti predefiniti.
        CalculateDefaultStrokes = true,
        
        // Impostazione del raggio di sfumatura post-elaborazione in base alla dimensione dell'immagine.
        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 });
    }
}

Applica filtri alle immagini

L’applicazione di filtri alle immagini ha vari scopi e le persone li utilizzano per una serie di motivi, sia pratici che artistici. Gli usi più comuni dei filtri immagine includono la correzione del colore, il miglioramento della qualità dell’immagine, l’applicazione di effetti speciali, la riduzione del rumore e così via. Aspose.Imaging.Drawing supporta diversi tipi di filtri che è possibile applicare alle immagini, come mediana, motion weiner, gauss weiner, ecc.

A scopo dimostrativo, dai un’occhiata al codice seguente che applica il filtro mediano a un’immagine utilizzando Aspose.Imaging.Drawing.

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

// Carica l'immagine rumorosa 
using (Image image = Image.Load(templatesFolder + "template.gif"))
{
    // Trasmetti l'immagine in RasterImage
    RasterImage rasterImage = image as RasterImage;
    if (rasterImage == null)
    {
        return;
    }

    // Crea un'istanza della classe MedianFilterOptions e imposta la dimensione, applica il filtro MedianFilterOptions all'oggetto RasterImage e salva l'immagine risultante
    MedianFilterOptions options = new MedianFilterOptions(4);
    rasterImage.Filter(image.Bounds, options);

    // Salva immagine
    image.Save(outputFolder + "median_filter.gif");
}

Ritaglia, ruota e ridimensiona le immagini

Ritagliare, ruotare e ridimensionare le immagini sono considerate le funzionalità essenziali delle applicazioni di modifica delle immagini. Sono le operazioni di elaborazione delle immagini più comuni utilizzate per manipolare le immagini digitali. Diamo un’occhiata a come ritagliare, ruotare e ridimensionare le immagini utilizzando l’API Aspose.Imaging.Drawing.

Ritaglia un’immagine

Per ritagliare un’immagine, è necessario fornire i valori di spostamento per tutti e quattro i lati dell’immagine. In base a questi valori, i limiti dell’immagine vengono spostati verso il centro dell’immagine. Il seguente frammento di codice C# ritaglia un’immagine in base ai valori di spostamento forniti.

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

// Carica un'immagine esistente in un'istanza della classe RasterImage
using (RasterImage rasterImage = (RasterImage)Image.Load(templatesFolder + "template.jpg"))
{
    // Prima di ritagliare, l'immagine dovrebbe essere memorizzata nella cache per prestazioni migliori
    if (!rasterImage.IsCached)
    {
        rasterImage.CacheData();
    }

    // Definire i valori di spostamento per tutti e quattro i lati
    int leftShift = 10;
    int rightShift = 10;
    int topShift = 10;
    int bottomShift = 10;

    // In base ai valori di spostamento, applica il ritaglio sull'immagine Il metodo Ritaglia sposterà i limiti dell'immagine verso il centro dell'immagine e salverà i risultati su disco
    rasterImage.Crop(leftShift, rightShift, topShift, bottomShift);

    // Salva l'immagine ritagliata
    rasterImage.Save(outputFolder + "cropped_image.jpg");
}

Ruota un’immagine

Per ruotare un’immagine, Aspose.Imaging.Drawing fornisce il metodo RotateFlip, che non solo ruota un’immagine ma la capovolge anche (se necessario). È possibile scegliere l’opzione di rotazione e capovolgimento desiderata dall’enum RotateFlipType. Il frammento di codice seguente illustra come ruotare un’immagine ma non capovolgerla in C#.

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

// Caricamento e rotazione dell'immagine
using (var image = Image.Load(templatesFolder + "template.jpg"))
{
    // Ruota l'immagine
    image.RotateFlip(RotateFlipType.Rotate270FlipNone);

    // Salva immagine
    image.Save(outputFolder + "rotated_image.jpg");
}

Ridimensionare un’immagine

Ridimensionare un’immagine utilizzando Aspose.Imaging.Drawing è semplice come una torta. Basta chiamare il metodo Resize e passare i nuovi valori di altezza e larghezza. Il frammento di codice seguente mostra come ridimensionare un’immagine in C#.

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

using (Image image = Image.Load(templatesFolder + "template.jpg"))
{
    // Ridimensiona l'immagine
    image.Resize(300, 300);

    // Salva immagine
    image.Save(outputFolder + "resized_image.jpg");
}   

Converti immagini in altri formati

Per convertire un’immagine utilizzando l’API Aspose.Imaging.Drawing, devi solo caricare l’immagine e salvarla nel formato di output desiderato. Il seguente frammento di codice converte un’immagine JPG nei formati WebP, PSD, PDF e TIFF.

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

using (var img = Aspose.Imaging.Image.Load(templatesFolder + "template.jpg"))
{
    // Salva in diversi formati di immagine
    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));

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

Ottieni una licenza API gratuita

Se desideri valutare l’API Aspose.Imaging.Drawing, puoi ottenere una licenza temporanea gratuita che ti consente di utilizzare l’API al massimo delle sue capacità senza alcuna limitazione.

Conclusione

Nel campo della grafica e dell’elaborazione delle immagini, l’API Aspose.Imaging.Drawing si distingue come uno strumento versatile e potente per gli sviluppatori C# .NET. Che tu stia cercando di migliorare gli elementi visivi, correggere le distorsioni delle immagini o convertire immagini tra formati, questa API fornisce un set completo di funzionalità. Con Aspose.Imaging.Drawing, la manipolazione delle immagini è a portata di mano, consentendoti di creare grafica accattivante e visivamente sorprendente a livello di programmazione.

Facci sapere il tuo feedback o le tue domande sul nostro forum.