Ulepsz przetwarzanie obrazów za pomocą nowoczesnego API

Wprowadzenie

Historycznie Aspose Slides ma zależność od System.Drawing i w publicznym API posiada następujące klasy z tego zakresu:

Od wersji 24.4 to publiczne API jest oznaczone jako przestarzałe.

Ponieważ wsparcie System.Drawing w wersjach .NET6 i wyższych zostało usunięte w wersjach nie‑Windows (breaking change), Slides wprowadziło podejście dwupakietowe:

Uciążliwością Aspose.Slides.NET6.CrossPlatform jest to, że implementuje własną wersję System.Drawing w tej samej przestrzeni nazw (aby zapewnić zgodność wsteczną z publicznym API). W związku z tym, gdy Aspose.Slides.NET6.CrossPlatform i System.Drawing z .NET Framework lub pakietu System.Drawing.Common są używane jednocześnie, występuje konflikt nazw, chyba że użyty zostanie alias.

Aby pozbyć się zależności od System.Drawing w głównym pakiecie Aspose.Slides.NET, dodaliśmy tzw. „Nowoczesne API” – czyli API, które powinno być używane zamiast przestarzałego, którego sygnatury zawierają zależności od następujących typów z System.Drawing: Image i Bitmap. PrinterSettings i Graphics są oznaczone jako przestarzałe i ich wsparcie zostało usunięte z publicznego API Slides.

W bieżących wersjach traktuj publiczne API zależne od System.Drawing jako starsze/przestarzałe. Używaj Nowoczesnego API w nowym kodzie i przy migracji istniejących przepływów przetwarzania obrazów.

Nowoczesne API

Dodano następujące klasy i wyliczenia do publicznego API:

Należy zauważyć, że IImage jest obiektem z możliwością zwolnienia (implementuje interfejs IDisposable i jego użycie powinno być opakowane w using lub zwolnione w inny dogodny sposób).

Użyj GetImage, aby renderować pojedynczy slajd lub kształt. Użyj GetImages, aby renderować wiele slajdów prezentacji. Użyj metod z Images do ładowania obrazów, AddImage z IImage aby dodać je do prezentacji oraz ReplaceImage z IImage aby zaktualizować istniejący obraz w prezentacji.

Typowy scenariusz użycia nowego API może wyglądać następująco:

using (Presentation pres = new Presentation())
{
    IPPImage ppImage;
    // utwórz obiekt IImage z pliku na dysku, który jest przeznaczony do zwolnienia.  
    using (IImage image = Images.FromFile("image.png"))
    {
        // utwórz obraz PowerPoint, dodając instancję IImage do kolekcji obrazów prezentacji.
        ppImage = pres.Images.AddImage(image);
    }

    // dodaj kształt obrazu na slajdzie #1
    pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);

    // pobierz instancję IImage reprezentującą slajd #1.
    using (var slideImage = pres.Slides[0].GetImage(new Size(1920, 1080)))
    {
        // zapisz obraz na dysku.
        slideImage.Save("slide1.jpeg", ImageFormat.Jpeg);
    }
}

Zastępowanie starego kodu nowoczesnym API

Aby ułatwić przejście, interfejs nowego IImage powiela oddzielne sygnatury klas Image i Bitmap. Generalnie wystarczy zamienić wywołanie starej metody używającej System.Drawing na nową.

Pobieranie miniatury slajdu

Legacy/deprecated API:

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

Modern API:

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

Pobieranie miniatury kształtu

Legacy/deprecated API:

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

Modern API:

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

Pobieranie miniatury prezentacji

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

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

Dodawanie obrazu do prezentacji

Legacy/deprecated 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);
}

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

Przestarzałe metody/właściwości i ich zamienniki w nowoczesnym API

Presentation

Sygnatura metody Sygnatura metody zamiennika
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

Shape

Sygnatura metody Sygnatura metody zamiennika
public Bitmap GetThumbnail() GetImage
public Bitmap GetThumbnail(ShapeThumbnailBounds bounds, float scaleX, float scaleY) GetImage(ShapeThumbnailBounds bounds, float scaleX, float scaleY)

Slide

Sygnatura metody Sygnatura metody zamiennika
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

Sygnatura metody Sygnatura metody zamiennika
public IOutputFile Add(string path, Image image) Add(string path, IImage image)

ImageCollection

Sygnatura metody Sygnatura metody zamiennika
IPPImage AddImage(Image image) AddImage(IImage image)

ImageWrapperFactory

Sygnatura metody Sygnatura metody zamiennika
IImageWrapper CreateImageWrapper(Image image) CreateImageWrapper(IImage image)

PPImage

Sygnatura metody/ własności Sygnatura metody zamiennika
void ReplaceImage(Image newImage) ReplaceImage(IImage newImage)
Image SystemImage { get; } IImage Image { get; }

PatternFormat

Sygnatura metody Sygnatura metody zamiennika
Bitmap GetTileImage(Color background, Color foreground) GetTile(Color background, Color foreground)
Bitmap GetTileImage(Color styleColor) GetTile(Color styleColor)

IPatternFormatEffectiveData

Sygnatura metody Sygnatura metody zamiennika
Bitmap GetTileImage(Color background, Color foreground) GetTileIImage(SlidesImage image)

Wsparcie API dla Graphics i PrinterSettings

Klasa Graphics nie jest obsługiwana w wersjach cross‑platform .NET6 i wyższych. W Aspose Slides użyj metod renderujących obrazy z Nowoczesnego API zamiast API renderującego do Graphics: ISlide

Również API związane z drukowaniem poprzez PrinterSettings nie ma bezpośredniego zamiennika w Nowoczesnym API:

IPresentation:

FAQ

Dlaczego Graphics został usunięty?

Wsparcie dla Graphics jest przestarzałe w publicznym API, aby ujednolicić pracę z renderowaniem i obrazami, wyeliminować powiązania z zależnościami specyficznymi dla platformy oraz przejść na podejście cross‑platform z użyciem IImage. Zamiast renderować do Graphics użyj GetImage lub GetImages.

Jaka jest praktyczna korzyść z IImage w porównaniu do Image/Bitmap?

IImage łączy pracę zarówno z obrazami rastrowymi, jak i wektorowymi, upraszcza zapisywanie do różnych formatów za pośrednictwem ImageFormat, zmniejsza zależność od System.Drawing i sprawia, że kod jest bardziej przenośny między środowiskami.

Czy Nowoczesne API wpłynie na wydajność generowania miniatur?

Przejście z GetThumbnail na GetImage nie pogarsza scenariuszy: nowe metody zapewniają te same możliwości tworzenia obrazów z opcjami i rozmiarami, zachowując wsparcie dla opcji renderowania. Konkretne zyski lub spadki zależą od scenariusza, ale funkcjonalnie zamienniki są równoważne.