Migliora l'elaborazione delle immagini con l'API Moderna

Introduzione

Storicamente, Aspose Slides ha una dipendenza da System.Drawing e ha nell’API pubblica le seguenti classi provenienti da lì:

A partire dalla versione 24.4, questa API pubblica è dichiarata obsoleta.

Poiché il supporto di System.Drawing nelle versioni .NET6 e successive è stato rimosso per le versioni non Windows (breaking change), Slides ha implementato un approccio a due pacchetti:

La difficoltà di Aspose.Slides.NET6.CrossPlatform è che implementa la propria versione di System.Drawing nello stesso namespace (per supportare la retrocompatibilità con l’API pubblica). Pertanto, quando Aspose.Slides.NET6.CrossPlatform e System.Drawing dal .NET Framework o dal pacchetto System.Drawing.Common vengono usati contemporaneamente, si verifica un conflitto di nomi a meno che non venga usato un alias.

Per eliminare le dipendenze da System.Drawing nel pacchetto principale Aspose.Slides.NET, abbiamo aggiunto la cosiddetta “Modern API” – cioè l’API da utilizzare al posto di quella deprecata, le cui firme contengono dipendenze dai seguenti tipi di System.Drawing: Image e Bitmap. PrinterSettings e Graphics sono dichiarati obsoleti e il loro supporto è stato rimosso dall’API pubblica di Slides.

Nelle versioni attuali, considerare l’API pubblica che dipende da System.Drawing come legacy/obsoleta. Utilizzare la Modern API per nuovo codice e quando si migra i flussi di lavoro di elaborazione delle immagini esistenti.

API Moderna

Aggiunte le seguenti classi e enum all’API pubblica:

Si noti che IImage è disposable (implementa l’interfaccia IDisposable e il suo utilizzo dovrebbe essere avvolto in un using o eliminato in un altro modo pratico).

Usa GetImage per renderizzare una singola diapositiva o forma. Usa GetImages per renderizzare diverse diapositive della presentazione. Usa i metodi di Images per caricare le immagini, AddImage con IImage per aggiungerle a una presentazione, e ReplaceImage con IImage per aggiornare un’immagine esistente della presentazione.

Uno scenario tipico di utilizzo della nuova API può apparire come segue:

using (Presentation pres = new Presentation())
{
    IPPImage ppImage;
    // istanzia un'istanza disposable di IImage dal file sul disco.  
    using (IImage image = Images.FromFile("image.png"))
    {
        // crea un'immagine PowerPoint aggiungendo un'istanza di IImage alle immagini della presentazione.
        ppImage = pres.Images.AddImage(image);
    }

    // aggiungi una forma immagine sulla diapositiva #1
    pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);

    // ottieni un'istanza di IImage che rappresenta la diapositiva #1.
    using (var slideImage = pres.Slides[0].GetImage(new Size(1920, 1080)))
    {
        // salva l'immagine sul disco.
        slideImage.Save("slide1.jpeg", ImageFormat.Jpeg);
    }
}

Sostituire il Codice Obsoleto con la Modern API

Per facilitare la transizione, l’interfaccia del nuovo IImage ripete le firme separate delle classi Image e Bitmap. In generale, dovrai semplicemente sostituire la chiamata al metodo vecchio che utilizza System.Drawing con quella nuova.

Ottenere una Miniatura della Diapositiva

API legacy/obsoleta:

using (Presentation pres = new Presentation("pres.pptx"))
{
    pres.Slides[0].GetThumbnail().Save("slide1.png");
}

API Moderna:

using (Presentation pres = new Presentation("pres.pptx"))
{
    pres.Slides[0].GetImage().Save("slide1.png");
}

Ottenere una Miniatura della Forma

API legacy/obsoleta:

using (Presentation pres = new Presentation("pres.pptx"))
{
    pres.Slides[0].Shapes[0].GetThumbnail().Save("shape.png");
}

API Moderna:

using (Presentation pres = new Presentation("pres.pptx"))
{
    pres.Slides[0].Shapes[0].GetImage().Save("shape.png");
}

Ottenere una Miniatura della Presentazione

API legacy/obsoleta:

using (Presentation pres = new Presentation("pres.pptx"))
{
    var bitmaps = pres.GetThumbnails(new RenderingOptions(), new Size(1980, 1028));
    try
    {
        for (var index = 0; index < bitmaps.Length; index++)
        {
            Bitmap thumbnail = bitmaps[index];
            thumbnail.Save($"slide{index}.png", ImageFormat.Png);
        }
    }
    finally
    {
        foreach (Bitmap bitmap in bitmaps)
        {
            bitmap.Dispose();
        }
    }
}

API Moderna:

using (Presentation pres = new Presentation("pres.pptx"))
{
    var images = pres.GetImages(new RenderingOptions(), new Size(1980, 1028));
    try
    {
        for (var index = 0; index < images.Length; index++)
        {
            IImage thumbnail = images[index];
            thumbnail.Save($"slide{index}.png", ImageFormat.Png);
        }
    }
    finally
    {
        foreach (IImage image in images)
        {
            image.Dispose();
        }
    }
}

Aggiungere un’Immagine a una Presentazione

API legacy/obsoleta:

using (Presentation pres = new Presentation())
{
    IPPImage ppImage;
    using (Image image = Image.FromFile("image.png"))
    {
        ppImage = pres.Images.AddImage(image);
    }

    pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
}

API Moderna:

using (Presentation pres = new Presentation())
{
    IPPImage ppImage;
    using (IImage image = Aspose.Slides.Images.FromFile("image.png"))
    {
        ppImage = pres.Images.AddImage(image);
    }

    pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
}

Metodi/Proprietà Deprecati e le loro Sostituzioni nella Modern API

Presentazione

Firma del Metodo Firma del Metodo di Sostituzione
public Bitmap[] GetThumbnails(IRenderingOptions options) GetImages(IRenderingOptions options)
public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides) GetImages(IRenderingOptions options, int[] slides)
public Bitmap[] GetThumbnails(IRenderingOptions options, float scaleX, float scaleY) GetImages(IRenderingOptions options, float scaleX, float scaleY)
public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides, float scaleX, float scaleY) GetImages(IRenderingOptions options, int[] slides, float scaleX, float scaleY)
public Bitmap[] GetThumbnails(IRenderingOptions options, Size imageSize) GetImages(IRenderingOptions options, Size imageSize)
public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides, Size imageSize) GetImages(IRenderingOptions options, int[] slides, Size imageSize)
public void Save(string fname, SaveFormat format, HttpResponse response, bool showInline) No Modern API replacement
public void Save(string fname, SaveFormat format, ISaveOptions options, HttpResponse response, bool showInline) No Modern API replacement
public void Print() No Modern API replacement
public void Print(PrinterSettings printerSettings) No Modern API replacement
public void Print(string printerName) No Modern API replacement
public void Print(PrinterSettings printerSettings, string presName) No Modern API replacement

Forma

Firma del Metodo Firma del Metodo di Sostituzione
public Bitmap GetThumbnail() GetImage
public Bitmap GetThumbnail(ShapeThumbnailBounds bounds, float scaleX, float scaleY) GetImage(ShapeThumbnailBounds bounds, float scaleX, float scaleY)

Diapositiva

Firma del Metodo Firma del Metodo di Sostituzione
public Bitmap GetThumbnail(float scaleX, float scaleY) GetImage(float scaleX, float scaleY)
public Bitmap GetThumbnail() GetImage
public Bitmap GetThumbnail(IRenderingOptions options) GetImage(IRenderingOptions options)
public Bitmap GetThumbnail(Size imageSize) GetImage(Size imageSize)
public Bitmap GetThumbnail(ITiffOptions options) GetImage(ITiffOptions options)
public Bitmap GetThumbnail(IRenderingOptions options, float scaleX, float scaleY) GetImage(IRenderingOptions options, float scaleX, float scaleY)
public Bitmap GetThumbnail(IRenderingOptions options, Size imageSize) GetImage(IRenderingOptions options, Size imageSize)
public void RenderToGraphics(IRenderingOptions options, Graphics graphics) No Modern API replacement
public void RenderToGraphics(IRenderingOptions options, Graphics graphics, float scaleX, float scaleY) No Modern API replacement
public void RenderToGraphics(IRenderingOptions options, Graphics graphics, Size renderingSize) No Modern API replacement

Output

Firma del Metodo Firma del Metodo di Sostituzione
public IOutputFile Add(string path, Image image) Add(string path, IImage image)

ImageCollection

Firma del Metodo Firma del Metodo di Sostituzione
IPPImage AddImage(Image image) AddImage(IImage image)

ImageWrapperFactory

Firma del Metodo Firma del Metodo di Sostituzione
IImageWrapper CreateImageWrapper(Image image) CreateImageWrapper(IImage image)

PPImage

Firma del Metodo/Proprietà Firma del Metodo di Sostituzione
void ReplaceImage(Image newImage) ReplaceImage(IImage newImage)
Image SystemImage { get; } IImage Image { get; }

PatternFormat

Firma del Metodo Firma del Metodo di Sostituzione
Bitmap GetTileImage(Color background, Color foreground) GetTile(Color background, Color foreground)
Bitmap GetTileImage(Color styleColor) GetTile(Color styleColor)

IPatternFormatEffectiveData

Firma del Metodo Firma del Metodo di Sostituzione
Bitmap GetTileImage(Color background, Color foreground) GetTileIImage(SlidesImage image)

Supporto API per Graphics e PrinterSettings

La classe Graphics non è supportata per le versioni cross‑platform di .NET6 e superiori. In Aspose Slides, usa i metodi di rendering di immagini della Modern API invece dell’API che renderizza su Graphics: ISlide

Inoltre, l’API correlata alla stampa tramite PrinterSettings non ha una sostituzione diretta nella Modern API:

IPresentation:

Domande Frequenti

Perché è stata rimossa Graphics?

Il supporto per Graphics è deprecato nell’API pubblica per unificare il lavoro con il rendering e le immagini, eliminare i legami a dipendenze specifiche della piattaforma e passare a un approccio cross‑platform con IImage. Usa GetImage o GetImages invece di renderizzare su Graphics.

Qual è il beneficio pratico di IImage rispetto a Image/Bitmap?

IImage unifica il lavoro con immagini raster e vettoriali, semplifica il salvataggio in vari formati tramite ImageFormat, riduce la dipendenza da System.Drawing e rende il codice più portabile tra ambienti.

Il Modern API influenzerà le prestazioni nella generazione delle miniature?

Il passaggio da GetThumbnail a GetImage non peggiora gli scenari: i nuovi metodi offrono le stesse capacità di produrre immagini con opzioni e dimensioni, mantenendo il supporto per le opzioni di rendering. Il guadagno o la perdita specifici dipendono dallo scenario, ma funzionalmente le sostituzioni sono equivalenti.