Bildverarbeitung mit der Modernen API verbessern

Einführung

Historisch hat Aspose Slides eine Abhängigkeit von System.Drawing und stellt in der öffentlichen API die folgenden Klassen daraus bereit:

Ab Version 24.4 ist diese öffentliche API als veraltet markiert.

Da die Unterstützung von System.Drawing in .NET6 und höher für Nicht‑Windows‑Versionen entfernt wurde (breaking change), hat Slides einen Ansatz mit zwei Bibliotheks‑Versionen implementiert:

Der Nachteil von Aspose.Slides.NET6.CrossPlatform ist, dass es seine eigene Version von System.Drawing im selben Namespace implementiert (um die Abwärtskompatibilität der öffentlichen API zu gewährleisten). Wird Aspose.Slides.NET6.CrossPlatform gleichzeitig mit System.Drawing aus .NETFramework oder dem System.Drawing.Common‑Paket verwendet, entsteht ein Namenskonflikt, sofern kein Alias verwendet wird.

Um die Abhängigkeiten von System.Drawing im Hauptpaket Aspose.Slides.NET zu entfernen, haben wir die sogenannte „Modern API“ eingeführt – d. h. die API, die anstelle der veralteten verwendet werden soll und deren Signaturen keine Abhängigkeiten mehr von den Typen Image und Bitmap aus System.Drawing enthalten. PrinterSettings und Graphics sind als veraltet markiert und ihre Unterstützung wurde aus der öffentlichen Slides‑API entfernt.

Die Entfernung der veralteten öffentlichen API mit Abhängigkeiten von System.Drawing erfolgt in Release 24.8.

Moderne API

Folgende Klassen und Aufzählungen wurden zur öffentlichen API hinzugefügt:

  • Aspose.Slides.IImage – stellt das Raster‑ oder Vektor‑Bild dar.
  • Aspose.Slides.ImageFormat – beschreibt das Dateiformat des Bildes.
  • Aspose.Slides.Images – Methoden zum Instanziieren und Arbeiten mit dem IImage‑Interface.

Bitte beachten Sie, dass IImage disposable ist (es implementiert das IDisposable‑Interface und sollte in einem using‑Block oder auf andere bequeme Weise freigegeben werden).

Ein typisches Anwendungsbeispiel der neuen API könnte wie folgt aussehen:

using (Presentation pres = new Presentation())
{
    IPPImage ppImage;
    // instanziieren Sie eine disposable Instanz von IImage aus der Datei auf der Festplatte.  
    using (IImage image = Images.FromFile("image.png"))
    {
        // erstellen Sie ein PowerPoint-Bild, indem Sie eine Instanz von IImage zu den Bildern der Präsentation hinzufügen.
        ppImage = pres.Images.AddImage(image);
    }

    // fügen Sie ein Bild-Shape auf Folie #1 hinzu
    pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);

    // erhalten Sie eine Instanz von IImage, die Folie #1 darstellt.
    using (var slideImage = pres.Slides[0].GetImage(new Size(1920, 1080)))
    {
        // speichern Sie das Bild auf der Festplatte.
        slideImage.Save("slide1.jpeg", ImageFormat.Jpeg);
    }
}

Alten Code durch Moderne API ersetzen

Zur Erleichterung der Migration wiederholt das Interface des neuen IImage die separaten Signaturen der Klassen Image und Bitmap. Im Allgemeinen müssen Sie lediglich den Aufruf der alten Methode aus System.Drawing durch den neuen ersetzen.

Erstellen eines Folien‑Thumbnails

Code mit einer veralteten API:

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

Moderne API:

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

Erstellen eines Shape‑Thumbnails

Code mit einer veralteten API:

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

Moderne API:

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

Erstellen eines Präsentations‑Thumbnails

Code mit einer veralteten API:

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();
        }
    }
}

Moderne API:

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();
        }
    }
}

Ein Bild zu einer Präsentation hinzufügen

Code mit einer veralteten API:

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);
}

Moderne API:

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);
}

Methoden/Eigenschaften, die entfernt werden und deren Ersatz in der Modernen API

Presentation

Method Signature Replacement Method Signature
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) Will be deleted completely
public void Save(string fname, SaveFormat format, ISaveOptions options, HttpResponse response, bool showInline) Will be deleted completely
public void Print() Will be deleted completely
public void Print(PrinterSettings printerSettings) Will be deleted completely
public void Print(string printerName) Will be deleted completely
public void Print(PrinterSettings printerSettings, string presName) Will be deleted completely

Shape

Method Signature Replacement Method Signature
public Bitmap GetThumbnail() GetImage
public Bitmap GetThumbnail(ShapeThumbnailBounds bounds, float scaleX, float scaleY) GetImage(ShapeThumbnailBounds bounds, float scaleX, float scaleY)

Slide

Method Signature Replacement Method Signature
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) Will be deleted completely
public void RenderToGraphics(IRenderingOptions options, Graphics graphics, float scaleX, float scaleY) Will be deleted completely
public void RenderToGraphics(IRenderingOptions options, Graphics graphics, Size renderingSize) Will be deleted completely

Output

Method Signature Replacement Method Signature
public IOutputFile Add(string path, Image image) Add(string path, IImage image)

ImageCollection

Method Signature Replacement Method Signature
IPPImage AddImage(Image image) AddImage(IImage image)

ImageWrapperFactory

Method Signature Replacement Method Signature
IImageWrapper CreateImageWrapper(Image image) CreateImageWrapper(IImage image)

PPImage

Method/Property Signature Replacement Method Signature
void ReplaceImage(Image newImage) ReplaceImage(IImage newImage)
Image SystemImage { get; } IImage Image { get; }

PatternFormat

Method Signature Replacement Method Signature
Bitmap GetTileImage(Color background, Color foreground) GetTile(Color background, Color foreground)
Bitmap GetTileImage(Color styleColor) GetTile(Color styleColor)

IPatternFormatEffectiveData

Method Signature Replacement Method Signature
Bitmap GetTileImage(Color background, Color foreground) GetTileIImage(SlidesImage image)

Unterstützung für Graphics und PrinterSettings wird eingestellt

Die Klasse Graphics wird für plattformübergreifende Versionen von .NET6 und höher nicht unterstützt. In Aspose Slides wird der Teil der API, der sie verwendet, entfernt: Slide

Auch der Teil der API, der das Drucken betrifft, wird entfernt:

Presentation:

FAQ

Warum wurde System.Drawing.Graphics entfernt?

Die Unterstützung für Graphics wird aus der öffentlichen API entfernt, um die Arbeit mit Rendering und Bildern zu vereinheitlichen, Abhängigkeiten von plattformspezifischen Bibliotheken zu eliminieren und auf einen plattformübergreifenden Ansatz mit IImage zu setzen. Alle Rendering‑Methoden, die Graphics verwenden, werden entfernt.

Welchen praktischen Nutzen hat IImage im Vergleich zu Image/Bitmap?

IImage vereinheitlicht die Arbeit mit Raster‑ und Vektorbildern, vereinfacht das Speichern in verschiedene Formate über ImageFormat, reduziert die Abhängigkeit von System.Drawing und macht den Code portabler über verschiedene Umgebungen hinweg.

Wird die Moderne API die Performance bei der Erzeugung von Thumbnails beeinflussen?

Der Wechsel von GetThumbnail zu GetImage verschlechtert die Szenarien nicht: Die neuen Methoden bieten dieselben Möglichkeiten zur Bildgenerierung mit Optionen und Größen, während sie weiterhin Rendering‑Optionen unterstützen. Der konkrete Gewinn oder Verlust hängt vom jeweiligen Szenario ab, funktional sind die Ersatzmethoden jedoch äquivalent.