Aprimorar o Processamento de Imagens com a API Moderna
Introdução
Historicamente, o Aspose Slides tem uma dependência de System.Drawing e possui na API pública as seguintes classes provenientes dela:
A partir da versão 24.4, essa API pública foi declarada obsoleta.
Como o suporte a System.Drawing nas versões .NET6 e superiores foi removido para versões não Windows (breaking changehttps://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only)), o Slides implementou uma abordagem de dois pacotes:
- Aspose.Slides.NET - suporte para .NET6+ no Windows, .NETStandard para Windows/Linux/MacOS, .NETFramework 2+ (Windows).
- tem uma dependência de System.Drawing.Common.
- Aspose.Slides.NET6.CrossPlatform - versão para Windows/Linux/MacOS sem dependências.
O inconveniente do Aspose.Slides.NET6.CrossPlatform é que ele implementa sua própria versão de System.Drawing no mesmo namespace (para suportar compatibilidade retroativa com a API pública). Assim, quando o Aspose.Slides.NET6.CrossPlatform e o System.Drawing do .NET Framework ou o pacote System.Drawing.Common são usados ao mesmo tempo, ocorre um conflito de nomes a menos que um alias seja usado.
Para eliminar dependências de System.Drawing no pacote principal Aspose.Slides.NET, adicionamos a chamada “API Moderna” – ou seja, a API que deve ser usada em vez da obsoleta, cujas assinaturas contêm dependências dos seguintes tipos de System.Drawing: Image e Bitmap. PrinterSettings e Graphics são declarados obsoletos e seu suporte foi removido da API pública do Slides.
Nas versões atuais, trate a API pública que depende de System.Drawing como legada/obsoleta. Use a API Moderna para novo código e ao migrar fluxos de trabalho existentes de processamento de imagens.
API Moderna
Foram adicionadas as seguintes classes e enums à API pública:
- Aspose.Slides.IImage - representa a imagem raster ou vetorial.
- Aspose.Slides.ImageFormat - representa o formato de arquivo da imagem.
- Aspose.Slides.Images - métodos para instanciar e trabalhar com a interface IImage.
Observe que IImage é descartável (implementa a interface IDisposable e seu uso deve ser encapsulado em using ou descartado de outra forma conveniente).
Use GetImage para renderizar um único slide ou forma. Use GetImages para renderizar vários slides da apresentação. Use os métodos de Images para carregar imagens, AddImage com IImage para adicioná‑las a uma apresentação, e ReplaceImage com IImage para atualizar uma imagem existente na apresentação.
Um cenário típico de uso da nova API pode ser o seguinte:
using (Presentation pres = new Presentation())
{
IPPImage ppImage;
// instanciar uma instância descartável de IImage a partir do arquivo no disco.
using (IImage image = Images.FromFile("image.png"))
{
// criar uma imagem PowerPoint adicionando uma instância de IImage às imagens da apresentação.
ppImage = pres.Images.AddImage(image);
}
// adicionar uma forma de imagem no slide #1
pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
// obter uma instância de IImage que representa o slide #1.
using (var slideImage = pres.Slides[0].GetImage(new Size(1920, 1080)))
{
// salvar a imagem no disco.
slideImage.Save("slide1.jpeg", ImageFormat.Jpeg);
}
}
Substituindo Código Antigo pela API Moderna
Para facilitar a transição, a interface do novo IImage repete as assinaturas separadas das classes Image e Bitmap. Em geral, você só precisará substituir a chamada ao método antigo que usava System.Drawing pelo novo.
Obtendo uma Miniatura de Slide
API legada/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");
}
Obtendo uma Miniatura de Forma
API legada/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");
}
Obtendo uma Miniatura de Apresentação
API legada/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();
}
}
}
Adicionando uma Imagem a uma Apresentação
API legada/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);
}
Métodos/Propriedades Obsoletos e Seu Substituto na API Moderna
Presentation
| Assinatura do Método | Assinatura do Método de Substituição |
|---|---|
| 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
| Assinatura do Método | Assinatura do Método de Substituição |
|---|---|
| public Bitmap GetThumbnail() | GetImage |
| public Bitmap GetThumbnail(ShapeThumbnailBounds bounds, float scaleX, float scaleY) | GetImage(ShapeThumbnailBounds bounds, float scaleX, float scaleY) |
Slide
| Assinatura do Método | Assinatura do Método de Substituição |
|---|---|
| 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
| Assinatura do Método | Assinatura do Método de Substituição |
|---|---|
| public IOutputFile Add(string path, Image image) | Add(string path, IImage image) |
ImageCollection
| Assinatura do Método | Assinatura do Método de Substituição |
|---|---|
| IPPImage AddImage(Image image) | AddImage(IImage image) |
ImageWrapperFactory
| Assinatura do Método | Assinatura do Método de Substituição |
|---|---|
| IImageWrapper CreateImageWrapper(Image image) | CreateImageWrapper(IImage image) |
PPImage
| Assinatura do Método/Propriedade | Assinatura do Método de Substituição |
|---|---|
| void ReplaceImage(Image newImage) | ReplaceImage(IImage newImage) |
| Image SystemImage { get; } | IImage Image { get; } |
PatternFormat
| Assinatura do Método | Assinatura do Método de Substituição |
|---|---|
| Bitmap GetTileImage(Color background, Color foreground) | GetTile(Color background, Color foreground) |
| Bitmap GetTileImage(Color styleColor) | GetTile(Color styleColor) |
IPatternFormatEffectiveData
| Assinatura do Método | Assinatura do Método de Substituição |
|---|---|
| Bitmap GetTileImage(Color background, Color foreground) | GetTileIImage(SlidesImage image) |
Suporte da API para Graphics e PrinterSettings
A classe Graphics não é suportada nas versões cross‑platform do .NET6 e superiores. No Aspose Slides, use os métodos de renderização de imagem da API Moderna em vez da API que renderiza para 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)
Além disso, a API relacionada à impressão através de PrinterSettings não tem substituto direto na API Moderna:
- public void Presentation.Print
- public void Print(PrinterSettings printerSettings)
- public void Print(string printerName)
- public void Print(PrinterSettings printerSettings, string presName)
Perguntas Frequentes
Por que o Graphics foi removido?
O suporte ao Graphics foi declarado obsoleto na API pública para unificar o trabalho com renderização e imagens, eliminar vínculos com dependências específicas de plataforma e migrar para uma abordagem cross‑platform com IImage. Use GetImage ou GetImages em vez de renderizar para Graphics.
Qual é o benefício prático do IImage em comparação com Image/Bitmap?
IImage unifica o trabalho com imagens raster e vetoriais, simplifica a gravação em vários formatos via ImageFormat, reduz a dependência de System.Drawing e torna o código mais portátil entre ambientes.
A API Moderna afetará o desempenho da geração de miniaturas?
A troca de GetThumbnail por GetImage não piora os cenários: os novos métodos fornecem as mesmas capacidades de produzir imagens com opções e tamanhos, mantendo o suporte a opções de renderização. O ganho ou perda específico depende do cenário, mas funcionalmente as substituições são equivalentes.