Gerenciar Quadros de Imagem em Apresentações no .NET
Introdução
Um quadro de imagem é uma forma que contém uma imagem — é como uma foto em uma moldura.
Você pode adicionar uma imagem a um slide através de um quadro de imagem. Dessa forma, você formata a imagem formatando o quadro de imagem.
Dica
A Aspose oferece conversores gratuitos — JPEG para PowerPoint e PNG para PowerPoint — que permitem criar apresentações rapidamente a partir de imagens.Criar um Quadro de Imagem
- Crie uma instância da classe Presentation.
- Obtenha a referência de um slide por seu índice.
- Crie um objeto IPPImage adicionando uma imagem à IImagescollection associada ao objeto de apresentação que será usado para preencher a forma.
- Especifique a largura e a altura da imagem.
- Crie um PictureFrame com base na largura e altura da imagem através do método
AddPictureFrameexposto pelo objeto shape associado ao slide referenciado. - Adicione um quadro de imagem (contendo a foto) ao slide.
- Grave a apresentação modificada como um arquivo PPTX.
Este código C# mostra como criar um quadro de imagem:
// Instancia a classe Presentation que representa um arquivo PPTX
using (Presentation pres = new Presentation())
{
// Obtém o primeiro slide
ISlide slide = pres.Slides[0];
// Carrega uma imagem e a adiciona à coleção de imagens da apresentação
IImage image = Images.FromFile("aspose-logo.jpg");
IPPImage ppImage = pres.Images.AddImage(image);
image.Dispose();
// Adiciona um quadro de imagem com a mesma altura e largura
IPictureFrame pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 150, ppImage.Width, ppImage.Height, ppImage);
// Aplica alguma formatação ao quadro de imagem
pictureFrame.LineFormat.FillFormat.FillType = FillType.Solid;
pictureFrame.LineFormat.FillFormat.SolidFillColor.Color = Color.Blue;
pictureFrame.LineFormat.Width = 20;
pictureFrame.Rotation = 45;
// Grava a apresentação em um arquivo PPTX
pres.Save("RectPicFrameFormat_out.pptx", SaveFormat.Pptx);
}
Criar um Quadro de Imagem com Escala Relativa
Alterando a escala relativa de uma imagem, você pode criar um quadro de imagem mais complexo.
- Crie uma instância da classe Presentation.
- Obtenha a referência de um slide por seu índice.
- Adicione uma imagem à coleção de imagens da apresentação.
- Crie um objeto IPPImage adicionando uma imagem à IImagescollection associada ao objeto de apresentação que será usado para preencher a forma.
- Especifique a largura e altura relativas da imagem no quadro de imagem.
- Grave a apresentação modificada como um arquivo PPTX.
Este código C# mostra como criar um quadro de imagem com escala relativa:
// Instancia a classe Presentation que representa um arquivo PPTX
using (Presentation presentation = new Presentation())
{
// Carrega uma imagem e a adiciona à coleção de imagens da apresentação
IImage image = Images.FromFile("aspose-logo.jpg");
IPPImage ppImage = presentation.Images.AddImage(image);
image.Dispose();
// Adiciona um quadro de imagem ao slide
IPictureFrame pictureFrame = presentation.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 50, 100, 100, ppImage);
// Define a largura e altura da escala relativa
pictureFrame.RelativeScaleHeight = 0.8f;
pictureFrame.RelativeScaleWidth = 1.35f;
// Salva a apresentação
presentation.Save("Adding Picture Frame with Relative Scale_out.pptx", SaveFormat.Pptx);
}
Extrair Imagens Raster de Quadros de Imagem
Você pode extrair imagens raster de objetos PictureFrame e salvá‑las em PNG, JPG e outros formatos. O exemplo de código abaixo demonstra como extrair uma imagem do documento “sample.pptx” e salvá‑la no formato PNG.
using (var presentation = new Presentation("sample.pptx"))
{
var firstSlide = presentation.Slides[0];
var firstShape = firstSlide.Shapes[0];
if (firstShape is IPictureFrame pictureFrame)
{
var image = pictureFrame.PictureFormat.Picture.Image.SystemImage;
image.Save("slide_1_shape_1.png", ImageFormat.Png);
}
}
Extrair Imagens SVG de Quadros de Imagem
Quando uma apresentação contém gráficos SVG inseridos dentro de formas PictureFrame, o Aspose.Slides for .NET permite recuperar as imagens vetoriais originais com fidelidade total. Percorrendo a coleção de formas do slide, você pode identificar cada PictureFrame, verificar se o IPPImage subjacente contém conteúdo SVG e, então, salvar essa imagem em disco ou em um stream no formato SVG nativo.
O código a seguir demonstra como extrair uma imagem SVG de um quadro de imagem:
using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];
var shape = slide.Shapes[0];
if (shape is IPictureFrame pictureFrame)
{
var svgImage = pictureFrame.PictureFormat.Picture.Image.SvgImage;
if (svgImage != null)
{
File.WriteAllText("output.svg", svgImage.SvgContent);
}
}
Obter Transparência de uma Imagem
O Aspose.Slides permite obter o efeito de transparência aplicado a uma imagem. Este código C# demonstra a operação:
using (var presentation = new Presentation("Test.pptx"))
{
var pictureFrame = (IPictureFrame)presentation.Slides[0].Shapes[0];
var imageTransform = pictureFrame.PictureFormat.Picture.ImageTransform;
foreach (var effect in imageTransform)
{
if (effect is IAlphaModulateFixed alphaModulateFixed)
{
var transparencyValue = 100 - alphaModulateFixed.Amount;
Console.WriteLine("Picture transparency: " + transparencyValue);
}
}
}
Obter Brilho e Contraste de uma Imagem
O Aspose.Slides permite obter o efeito de brilho e contraste aplicado a uma imagem. A interface ILuminance representa esse efeito de transformação de imagem.
Este código C# demonstra como obter as configurações de brilho e contraste de um quadro de imagem:
using (var presentation = new Presentation("sample.pptx"))
{
var slide = presentation.Slides[0];
var shape = slide.Shapes[0];
var pictureFrame = (IPictureFrame)shape;
var imageTransform = pictureFrame.PictureFormat.Picture.ImageTransform;
foreach (var effect in imageTransform)
{
if (effect is ILuminance luminanceEffect)
{
var luminance = luminanceEffect.GetEffective();
var brightness = luminance.Brightness;
var contrast = luminance.Contrast;
Console.WriteLine("Brightness: " + brightness);
Console.WriteLine("Contrast: " + contrast);
}
}
}
Formatação de Quadros de Imagem
O Aspose.Slides fornece muitas opções de formatação que podem ser aplicadas a um quadro de imagem. Usando essas opções, você pode alterar um quadro de imagem para que atenda a requisitos específicos.
- Crie uma instância da classe Presentation.
- Obtenha a referência de um slide por seu índice.
- Crie um objeto IPPImage adicionando uma imagem à IImagescollection associada ao objeto de apresentação que será usado para preencher a forma.
- Especifique a largura e a altura da imagem.
- Crie um
PictureFramecom base na largura e altura da imagem através do método AddPictureFrame exposto pelo objeto IShapes associado ao slide referenciado. - Adicione o quadro de imagem (contendo a foto) ao slide.
- Defina a cor da linha do quadro de imagem.
- Defina a largura da linha do quadro de imagem.
- Gire o quadro de imagem fornecendo um valor positivo ou negativo.
- Um valor positivo gira a imagem no sentido horário.
- Um valor negativo gira a imagem no sentido anti‑horário.
- Adicione o quadro de imagem (contendo a foto) ao slide.
- Grave a apresentação modificada como um arquivo PPTX.
Este código C# demonstra o processo de formatação do quadro de imagem:
// Instancia a classe Presentation que representa um arquivo PPTX
using (Presentation presentation = new Presentation())
{
// Obtém o primeiro slide
ISlide slide = presentation.Slides[0];
// Carrega uma imagem e a adiciona à coleção de imagens da apresentação
IImage image = Images.FromFile("aspose-logo.jpg");
IPPImage ppImage = presentation.Images.AddImage(image);
image.Dispose();
// Adiciona um quadro de imagem com a altura e largura equivalentes da imagem
IPictureFrame pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 150, ppImage.Width, ppImage.Height, ppImage);
// Aplica alguma formatação ao quadro de imagem
pictureFrame.LineFormat.FillFormat.FillType = FillType.Solid;
pictureFrame.LineFormat.FillFormat.SolidFillColor.Color = Color.Blue;
pictureFrame.LineFormat.Width = 20;
pictureFrame.Rotation = 45;
// Grava a apresentação em um arquivo PPTX
presentation.Save("RectPicFrameFormat_out.pptx", SaveFormat.Pptx);
}
Adicionar uma Imagem como Link
Para evitar tamanhos grandes de apresentação, você pode adicionar imagens (ou vídeos) por meio de links em vez de incorporar os arquivos diretamente nas apresentações. Este código C# mostra como adicionar uma imagem e um vídeo em um placeholder:
using (var presentation = new Presentation("input.pptx"))
{
var shapesToRemove = new List<IShape>();
int shapesCount = presentation.Slides[0].Shapes.Count;
for (var i = 0; i < shapesCount; i++)
{
var autoShape = presentation.Slides[0].Shapes[i];
if (autoShape.Placeholder == null)
{
continue;
}
switch (autoShape.Placeholder.Type)
{
case PlaceholderType.Picture:
var pictureFrame = presentation.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle,
autoShape.X, autoShape.Y, autoShape.Width, autoShape.Height, null);
pictureFrame.PictureFormat.Picture.LinkPathLong =
"https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg";
shapesToRemove.Add(autoShape);
break;
case PlaceholderType.Media:
var videoFrame = presentation.Slides[0].Shapes.AddVideoFrame(
autoShape.X, autoShape.Y, autoShape.Width, autoShape.Height, "");
videoFrame.PictureFormat.Picture.LinkPathLong =
"https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg";
videoFrame.LinkPathLong = "https://youtu.be/t_1LYZ102RA";
shapesToRemove.Add(autoShape);
break;
}
}
foreach (var shape in shapesToRemove)
{
presentation.Slides[0].Shapes.Remove(shape);
}
presentation.Save("output.pptx", SaveFormat.Pptx);
}
Cortar Imagens
Este código C# mostra como cortar uma imagem existente em um slide:
using (Presentation presentation = new Presentation())
{
// Cria um novo objeto de imagem
IImage image = Images.FromFile(imagePath);
IPPImage newImage = presentation.Images.AddImage(image);
image.Dispose();
// Adiciona um PictureFrame a um slide
IPictureFrame picFrame = presentation.Slides[0].Shapes.AddPictureFrame(
ShapeType.Rectangle, 100, 100, 420, 250, newImage);
// Recorta a imagem (valores em porcentagem)
picFrame.PictureFormat.CropLeft = 23.6f;
picFrame.PictureFormat.CropRight = 21.5f;
picFrame.PictureFormat.CropTop = 3;
picFrame.PictureFormat.CropBottom = 31;
// Salva o resultado
presentation.Save("PictureFrameCrop.pptx", SaveFormat.Pptx);
}
Excluir Áreas Cortadas de uma Imagem
Se quiser excluir as áreas cortadas de uma imagem contida em um quadro, pode usar o método IPictureFillFormat.DeletePictureCroppedAreas. Esse método devolve a imagem cortada ou a imagem original se o recorte for desnecessário.
Este código C# demonstra a operação:
using (Presentation presentation = new Presentation("PictureFrameCrop.pptx"))
{
ISlide slide = presentation.Slides[0];
// Obtém o PictureFrame do primeiro slide
IPictureFrame picFrame = slide.Shapes[0] as IPictureFrame;
// Exclui áreas recortadas da imagem do PictureFrame e devolve a imagem recortada
IPPImage croppedImage = picFrame.PictureFormat.DeletePictureCroppedAreas();
// Salva o resultado
presentation.Save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
}
NOTA
O método IPictureFillFormat.DeletePictureCroppedAreas adiciona a imagem recortada à coleção de imagens da apresentação. Se a imagem for usada apenas no PictureFrame processado, essa configuração pode reduzir o tamanho da apresentação. Caso contrário, o número de imagens na apresentação resultante aumentará.
Esse método converte arquivos metafile WMF/EMF para imagem PNG raster no processo de recorte.
Compactar Imagens
Você pode compactar uma imagem em uma apresentação usando o método IPictureFillFormat.CompressImage.
Esse método compacta a imagem reduzindo seu tamanho com base no tamanho da forma e na resolução especificada, com a opção de excluir áreas recortadas.
Ele ajusta o tamanho e a resolução da imagem de forma semelhante ao recurso Formato da Imagem → Compactar Imagens → Resolução do PowerPoint.
Os exemplos C# a seguir demonstram como compactar uma imagem em uma apresentação especificando uma resolução alvo e, opcionalmente, removendo áreas recortadas:
using (Presentation presentation = new Presentation("demo.pptx"))
{
ISlide slide = presentation.Slides[0];
IPictureFrame pictureFrame = slide.Shapes[0] as IPictureFrame;
// Compacta a imagem com resolução alvo de 150 DPI (resolução da Web) e remove áreas recortadas.
bool result = pictureFrame.PictureFormat.CompressImage(true, PicturesCompression.Dpi150);
// Verifica o resultado da compactação.
if (result)
{
Console.WriteLine("Image successfully compressed.");
}
else
{
Console.WriteLine("Image compression failed or no changes were necessary.");
}
presentation.Save("CompressedImage.pptx", SaveFormat.Pptx);
}
Ou usando um valor DPI personalizado diretamente:
using (Presentation presentation = new Presentation("demo.pptx"))
{
ISlide slide = presentation.Slides[0];
IPictureFrame pictureFrame = slide.Shapes[0] as IPictureFrame;
// Compacta a imagem para 150 DPI (resolução web), removendo áreas recortadas.
pictureFrame.PictureFormat.CompressImage(true, 150f);
presentation.Save("CompressedImage.pptx", SaveFormat.Pptx);
}
NOTA
O método converte a imagem para uma resolução mais baixa com base no tamanho da forma e no DPI fornecido. Regiões recortadas também podem ser excluídas para otimizar o tamanho do arquivo.Se a imagem for um metafile (WMF/EMF) ou SVG, a compactação não será aplicada. Além disso, a qualidade do JPEG é preservada ou ligeiramente reduzida conforme a resolução, de maneira semelhante ao que o PowerPoint faz com JPEGs de alta resolução.
Bloquear Proporção
Se desejar que uma forma contendo uma imagem mantenha sua proporção mesmo após alterar as dimensões da imagem, pode usar a propriedade IPictureFrameLock.AspectRatioLocked para definir a configuração Bloquear Proporção.
Este código C# mostra como bloquear a proporção de uma forma:
using (Presentation pres = new Presentation("pres.pptx"))
{
ILayoutSlide layout = pres.LayoutSlides.GetByType(SlideLayoutType.Custom);
ISlide emptySlide = pres.Slides.AddEmptySlide(layout);
IImage image = Images.FromFile("image.png");
IPPImage presImage = pres.Images.AddImage(image);
image.Dispose();
IPictureFrame pictureFrame = emptySlide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 150, presImage.Width, presImage.Height, presImage);
// Define a forma para manter a proporção ao redimensionar
pictureFrame.PictureFrameLock.AspectRatioLocked = true;
}
NOTA
Essa configuração Bloquear Proporção preserva apenas a proporção da forma, não a da imagem que ela contém.Usar a Propriedade StretchOff
Usando as propriedades StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight e StretchOffsetBottom da interface IPictureFillFormat e da classe PictureFillFormat, você pode especificar um retângulo de preenchimento.
Quando o estiramento é especificado para uma imagem, um retângulo de origem é escalado para caber no retângulo de preenchimento especificado. Cada borda do retângulo de preenchimento é definida por um deslocamento percentual a partir da borda correspondente da caixa delimitadora da forma. Um percentual positivo indica inserção, enquanto um percentual negativo indica projeção.
- Crie uma instância da Presentation class.
- Obtenha a referência de um slide por seu índice.
- Adicione um retângulo
AutoShape. - Crie uma imagem.
- Defina o tipo de preenchimento da forma.
- Defina o modo de preenchimento de imagem da forma.
- Defina a imagem de preenchimento da forma.
- Especifique os deslocamentos da imagem a partir das bordas correspondentes da caixa delimitadora da forma.
- Grave a apresentação modificada como um arquivo PPTX.
Este código C# demonstra um processo que usa a propriedade StretchOff:
using (Presentation pres = new Presentation())
{
IImage image = Images.FromFile("image.png");
IPPImage ppImage = pres.Images.AddImage(image);
image.Dispose();
IPPictureFrame pictureFrame = pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 400, 400, ppImage);
// Define a imagem esticada em todos os lados no corpo da forma
pictureFrame.PictureFormat.PictureFillMode = PictureFillMode.Stretch;
pictureFrame.PictureFormat.StretchOffsetLeft = 24;
pictureFrame.PictureFormat.StretchOffsetRight = 24;
pictureFrame.PictureFormat.StretchOffsetTop = 24;
pictureFrame.PictureFormat.StretchOffsetBottom = 24;
pres.Save("imageStretch.pptx", SaveFormat.Pptx);
}
Perguntas Frequentes
Como descobrir quais formatos de imagem são suportados para PictureFrame?
O Aspose.Slides suporta tanto imagens raster (PNG, JPEG, BMP, GIF etc.) quanto imagens vetoriais (por exemplo, SVG) por meio do objeto de imagem atribuído a um PictureFrame. A lista de formatos suportados geralmente coincide com as capacidades do motor de conversão de slides e imagens.
Como a adição de dezenas de imagens grandes afeta o tamanho e o desempenho do PPTX?
Incorporar imagens grandes aumenta o tamanho do arquivo e o uso de memória; vincular imagens ajuda a manter o tamanho da apresentação reduzido, mas requer que os arquivos externos permaneçam acessíveis. O Aspose.Slides permite adicionar imagens por link para reduzir o tamanho do arquivo.
Como bloquear um objeto de imagem contra movimentação/redimensionamento acidental?
Use travas de forma para um PictureFrame (por exemplo, desabilitar mover ou redimensionar). O mecanismo de bloqueio é descrito para formas em um artigo separado de proteção e é suportado para vários tipos de forma, incluindo PictureFrame.
A fidelidade vetorial do SVG é preservada ao exportar uma apresentação para PDF/imagens?
O Aspose.Slides permite extrair um SVG de um PictureFrame como o vetor original. Ao exportar para PDF ou formatos raster /converter para PNG, o resultado pode ser rasterizado dependendo das configurações de exportação; o fato de o SVG original ser armazenado como vetor é confirmado pelo comportamento de extração.