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:
- Aspose.Slides.NET – wsparcie dla .NET6+ na Windows, .NETStandard dla Windows/Linux/MacOS, .NETFramework 2+ (Windows).
- ma zależność od System.Drawing.Common.
- Aspose.Slides.NET6.CrossPlatform – wersja Windows/Linux/MacOS bez zależności.
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:
- Aspose.Slides.IImage – reprezentuje obraz rastrowy lub wektorowy.
- Aspose.Slides.ImageFormat – reprezentuje format pliku obrazu.
- Aspose.Slides.Images – metody służące do tworzenia i pracy z interfejsem IImage.
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
- public void RenderToGraphics(IRenderingOptions options, Graphics graphics)
- public void RenderToGraphics(IRenderingOptions options, Graphics graphics, float scaleX, float scaleY)
- public void RenderToGraphics(IRenderingOptions options, Graphics graphics, Size renderingSize)
Również API związane z drukowaniem poprzez PrinterSettings nie ma bezpośredniego zamiennika w Nowoczesnym API:
- public void Presentation.Print
- public void Print(PrinterSettings printerSettings)
- public void Print(string printerName)
- public void Print(PrinterSettings printerSettings, string presName)
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.