Zlepšení zpracování obrázků pomocí Moderního API
Úvod
Historicky má Aspose Slides závislost na System.Drawing a v veřejném API obsahuje následující třídy z této knihovny:
Od verze 24.4 je toto veřejné API označeno jako zastaralé.
Jelikož podpora System.Drawing ve verzích .NET6 a vyšších byla odstraněna pro ne‑Windows verze (breaking change), Slides implementoval dvoubalíčkový přístup:
- Aspose.Slides.NET – podpora pro .NET6+ na Windows, .NETStandard pro Windows/Linux/macOS, .NETFramework 2+ (Windows).
- závisí na System.Drawing.Common.
- Aspose.Slides.NET6.CrossPlatform – verze pro Windows/Linux/macOS bez externích závislostí.
Nevýhodou Aspose.Slides.NET6.CrossPlatform je, že implementuje vlastní verzi System.Drawing ve stejném jmenném prostoru (kvůli zpětné kompatibilitě s veřejným API). Proto při současném použití Aspose.Slides.NET6.CrossPlatform a System.Drawing z .NET Framework nebo balíčku System.Drawing.Common dochází ke konfliktu názvů, pokud není použita aliasace.
Abychom se zbavili závislostí na System.Drawing v hlavním balíčku Aspose.Slides.NET, přidali jsme takzvané „Moderní API“ – tj. API, které má být použito místo zastaralého, jehož signatury obsahují závislosti na typech Image a Bitmap. PrinterSettings a Graphics jsou označeny jako zastaralé a jejich podpora je z veřejného API Slides odstraněna.
V současných verzích považujte veřejné API závislé na System.Drawing za legacy/zastaralé. Používejte Moderní API pro nový kód i při migraci existujících workflow zpracování obrázků.
Moderní API
Do veřejného API byly přidány následující třídy a výčty:
- Aspose.Slides.IImage – představuje rastrový nebo vektorový obrázek.
- Aspose.Slides.ImageFormat – představuje formát souboru obrázku.
- Aspose.Slides.Images – metody pro vytvoření a práci s rozhraním IImage.
Všimněte si, že IImage je disposable (implementuje rozhraní IDisposable a jeho použití by mělo být obaleno pomocí using nebo uvolněno jiným vhodným způsobem).
Použijte GetImage pro vykreslení jedné snímku nebo tvaru. Použijte GetImages pro vykreslení několika snímků prezentace. Použijte metody Images k načtení obrázků, AddImage s IImage pro jejich přidání do prezentace a ReplaceImage s IImage pro aktualizaci existujícího obrázku v prezentaci.
Typický scénář použití nového API může vypadat následovně:
using (Presentation pres = new Presentation())
{
IPPImage ppImage;
// vytvořte odpadatelnou instanci IImage ze souboru na disku.
using (IImage image = Images.FromFile("image.png"))
{
// vytvořte obrázek PowerPoint tím, že přidáte instanci IImage do obrázků prezentace.
ppImage = pres.Images.AddImage(image);
}
// přidejte obrázkový tvar na snímek #1
pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
// získáte instanci IImage představující snímek #1.
using (var slideImage = pres.Slides[0].GetImage(new Size(1920, 1080)))
{
// uložte obrázek na disk.
slideImage.Save("slide1.jpeg", ImageFormat.Jpeg);
}
}
Nahrazení starého kódu moderním API
Pro usnadnění přechodu rozhraní nového IImage opakuje samostatné signatury tříd Image a Bitmap. V podstatě stačí nahradit volání staré metody používající System.Drawing novou.
Získání miniatury snímku
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");
}
Získání miniatury tvaru
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");
}
Získání miniatury prezentace
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();
}
}
}
Přidání obrázku do prezentace
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);
}
Zastaralé metody/vlastnosti a jejich náhrada v moderním API
Presentation
| Podpis metody | Podpis nahrazující metody |
|---|---|
| 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) | Žádná náhrada v moderním API |
| public void Save(string fname, SaveFormat format, ISaveOptions options, HttpResponse response, bool showInline) | Žádná náhrada v moderním API |
| public void Print() | Žádná náhrada v moderním API |
| public void Print(PrinterSettings printerSettings) | Žádná náhrada v moderním API |
| public void Print(string printerName) | Žádná náhrada v moderním API |
| public void Print(PrinterSettings printerSettings, string presName) | Žádná náhrada v moderním API |
Shape
| Podpis metody | Podpis nahrazující metody |
|---|---|
| public Bitmap GetThumbnail() | GetImage |
| public Bitmap GetThumbnail(ShapeThumbnailBounds bounds, float scaleX, float scaleY) | GetImage(ShapeThumbnailBounds bounds, float scaleX, float scaleY) |
Slide
| Podpis metody | Podpis nahrazující metody |
|---|---|
| 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) | Žádná náhrada v moderním API |
| public void RenderToGraphics(IRenderingOptions options, Graphics graphics, float scaleX, float scaleY) | Žádná náhrada v moderním API |
| public void RenderToGraphics(IRenderingOptions options, Graphics graphics, Size renderingSize) | Žádná náhrada v moderním API |
Output
| Podpis metody | Podpis nahrazující metody |
|---|---|
| public IOutputFile Add(string path, Image image) | Add(string path, IImage image) |
ImageCollection
| Podpis metody | Podpis nahrazující metody |
|---|---|
| IPPImage AddImage(Image image) | AddImage(IImage image) |
ImageWrapperFactory
| Podpis metody | Podpis nahrazující metody |
|---|---|
| IImageWrapper CreateImageWrapper(Image image) | CreateImageWrapper(IImage image) |
PPImage
| Podpis metody/vlastnosti | Podpis nahrazující metody |
|---|---|
| void ReplaceImage(Image newImage) | ReplaceImage(IImage newImage) |
| Image SystemImage { get; } | IImage Image { get; } |
PatternFormat
| Podpis metody | Podpis nahrazující metody |
|---|---|
| Bitmap GetTileImage(Color background, Color foreground) | GetTile(Color background, Color foreground) |
| Bitmap GetTileImage(Color styleColor) | GetTile(Color styleColor) |
IPatternFormatEffectiveData
| Podpis metody | Podpis nahrazující metody |
|---|---|
| Bitmap GetTileImage(Color background, Color foreground) | GetTileIImage(SlidesImage image) |
Podpora API pro Graphics a PrinterSettings
Třída Graphics není podporována pro cross‑platform verze .NET6 a novější. V Aspose Slides použijte metody renderování obrázků Moderního API místo API, které renderuje 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)
Také API související s tiskem přes PrinterSettings nemá přímou náhradu v Moderním API:
- public void Presentation.Print
- public void Print(PrinterSettings printerSettings)
- public void Print(string printerName)
- public void Print(PrinterSettings printerSettings, string presName)
Často kladené otázky
Proč bylo Graphics odstraněno?
Podpora Graphics je v veřejném API označena jako zastaralá, aby se sjednotila práce s renderováním a obrázky, eliminovaly se vazby na platformně specifické závislosti a přešlo se na cross‑platform přístup s IImage. Používejte GetImage nebo GetImages místo renderování do Graphics.
Jaký je praktický přínos IImage oproti Image/Bitmap?
IImage sjednocuje práci s rastrovými i vektorovými obrázky, zjednodušuje ukládání do různých formátů pomocí ImageFormat, snižuje závislost na System.Drawing a činí kód přenosnějším mezi prostředími.
Ovlivní Moderní API výkon při generování miniatur?
Přepnutí z GetThumbnail na GetImage výkon nesnižuje. Nové metody nabízejí stejné možnosti tvorby obrázků s volbami a velikostmi a zachovávají podporu pro renderovací možnosti. Konkrétní zisk či pokles výkonu závisí na scénáři, ale funkčně jsou náhrady ekvivalentní.