Administrar marcos de imagen en presentaciones en .NET
Un marco de imagen es una forma que contiene una imagen; es como una foto en un marco.
Puedes agregar una imagen a una diapositiva mediante un marco de imagen. De esta manera, puedes dar formato a la imagen formateando el marco de imagen.
Tip
Aspose ofrece convertidores gratuitos—JPEG a PowerPoint y PNG a PowerPoint—que permiten crear presentaciones rápidamente a partir de imágenes.Crear un Marco de Imagen
- Crea una instancia de la clase Presentation.
- Obtén una referencia a una diapositiva a través de su índice.
- Crea un objeto IPPImage añadiendo una imagen a la IImagescollection asociada al objeto presentation que se utilizará para rellenar la forma.
- Especifica el ancho y la altura de la imagen.
- Crea un PictureFrame basado en el ancho y la altura de la imagen mediante el método
AddPictureFrameexpuesto por el objeto shape asociado a la diapositiva referenciada. - Añade un marco de imagen (que contiene la foto) a la diapositiva.
- Guarda la presentación modificada como un archivo PPTX.
Este código C# muestra cómo crear un marco de imagen:
// Instancia la clase Presentation que representa un archivo PPTX
using (Presentation pres = new Presentation())
{
// Obtiene la primera diapositiva
ISlide slide = pres.Slides[0];
// Carga una imagen y la agrega a la colección de imágenes de la presentación
IImage image = Images.FromFile("aspose-logo.jpg");
IPPImage ppImage = pres.Images.AddImage(image);
image.Dispose();
// Agrega un marco de imagen con la misma altura y anchura
IPictureFrame pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 150, ppImage.Width, ppImage.Height, ppImage);
// Aplica algo de formato al marco de imagen
pictureFrame.LineFormat.FillFormat.FillType = FillType.Solid;
pictureFrame.LineFormat.FillFormat.SolidFillColor.Color = Color.Blue;
pictureFrame.LineFormat.Width = 20;
pictureFrame.Rotation = 45;
// Escribe la presentación en un archivo PPTX
pres.Save("RectPicFrameFormat_out.pptx", SaveFormat.Pptx);
}
Crear un Marco de Imagen con Escala Relativa
Al alterar la escala relativa de una imagen, puedes crear un marco de imagen más complejo.
- Crea una instancia de la clase Presentation.
- Obtén una referencia a una diapositiva a través de su índice.
- Añade una imagen a la colección de imágenes de la presentación.
- Crea un objeto IPPImage añadiendo una imagen a la IImagescollection asociada al objeto presentation que se utilizará para rellenar la forma.
- Especifica el ancho y la altura relativos de la imagen en el marco de imagen.
- Guarda la presentación modificada como un archivo PPTX.
Este código C# muestra cómo crear un marco de imagen con escala relativa:
// Instancia la clase Presentation que representa un archivo PPTX
using (Presentation presentation = new Presentation())
{
// Carga una imagen y la agrega a la colección de imágenes de la presentación
IImage image = Images.FromFile("aspose-logo.jpg");
IPPImage ppImage = presentation.Images.AddImage(image);
image.Dispose();
// Agrega un marco de imagen a la diapositiva
IPictureFrame pictureFrame = presentation.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 50, 100, 100, ppImage);
// Establece la escala relativa de ancho y alto
pictureFrame.RelativeScaleHeight = 0.8f;
pictureFrame.RelativeScaleWidth = 1.35f;
// Guarda la presentación
presentation.Save("Adding Picture Frame with Relative Scale_out.pptx", SaveFormat.Pptx);
}
Extraer Imágenes Rasterizadas de los Marcos de Imagen
Puedes extraer imágenes rasterizadas de objetos PictureFrame y guardarlas en PNG, JPG y otros formatos. El ejemplo de código a continuación muestra cómo extraer una imagen del documento “sample.pptx” y guardarla en 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);
}
}
Extraer Imágenes SVG de los Marcos de Imagen
Cuando una presentación contiene gráficos SVG colocados dentro de formas PictureFrame, Aspose.Slides para .NET permite recuperar las imágenes vectoriales originales con plena fidelidad. Al recorrer la colección de formas de la diapositiva, puedes identificar cada PictureFrame, comprobar si el IPPImage subyacente contiene contenido SVG y, a continuación, guardar esa imagen en disco o en un flujo en su formato SVG nativo.
El siguiente ejemplo de código muestra cómo extraer una imagen SVG de un marco de imagen:
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);
}
}
Obtener Transparencia de una Imagen
Aspose.Slides te permite obtener el efecto de transparencia aplicado a una imagen. Este código C# demuestra la operación:
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);
}
}
}
Formato de Marcos de Imagen
Aspose.Slides ofrece muchas opciones de formato que pueden aplicarse a un marco de imagen. Con esas opciones, puedes modificar un marco de imagen para que cumpla requisitos específicos.
- Crea una instancia de la clase Presentation .
- Obtén una referencia a una diapositiva a través de su índice.
- Crea un objeto IPPImage añadiendo una imagen a la IImagescollection asociada al objeto presentation que se utilizará para rellenar la forma.
- Especifica el ancho y la altura de la imagen.
- Crea un
PictureFramebasado en el ancho y la altura de la imagen mediante el método AddPictureFrame expuesto por el objeto IShapes asociado a la diapositiva referenciada. - Añade el marco de imagen (que contiene la foto) a la diapositiva.
- Establece el color de línea del marco de imagen.
- Establece el ancho de línea del marco de imagen.
- Rota el marco de imagen dándole un valor positivo o negativo.
- Un valor positivo rota la imagen en sentido horario.
- Un valor negativo rota la imagen en sentido antihorario.
- Añade el marco de imagen (que contiene la foto) a la diapositiva.
- Guarda la presentación modificada como un archivo PPTX.
Este código C# muestra el proceso de formateo del marco de imagen:
// Instancia la clase Presentation que representa un archivo PPTX
using (Presentation presentation = new Presentation())
{
// Obtiene la primera diapositiva
ISlide slide = presentation.Slides[0];
// Carga una imagen y la agrega a la colección de imágenes de la presentación
IImage image = Images.FromFile("aspose-logo.jpg");
IPPImage ppImage = presentation.Images.AddImage(image);
image.Dispose();
// Agrega un marco de imagen con la misma altura y anchura de la imagen
IPictureFrame pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 150, ppImage.Width, ppImage.Height, ppImage);
// Aplica algo de formato al marco de imagen
pictureFrame.LineFormat.FillFormat.FillType = FillType.Solid;
pictureFrame.LineFormat.FillFormat.SolidFillColor.Color = Color.Blue;
pictureFrame.LineFormat.Width = 20;
pictureFrame.Rotation = 45;
// Escribe la presentación en un archivo PPTX
presentation.Save("RectPicFrameFormat_out.pptx", SaveFormat.Pptx);
}
Agregar una Imagen como Enlace
Para evitar tamaños grandes de presentación, puedes agregar imágenes (o videos) mediante enlaces en lugar de incrustar los archivos directamente en las presentaciones. Este código C# muestra cómo agregar una imagen y un video en un marcador de posición:
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);
}
Recortar Imágenes
Este código C# muestra cómo recortar una imagen existente en una diapositiva:
using (Presentation presentation = new Presentation())
{
// Crea un nuevo objeto de imagen
IImage image = Images.FromFile(imagePath);
IPPImage newImage = presentation.Images.AddImage(image);
image.Dispose();
// Agrega un PictureFrame a una diapositiva
IPictureFrame picFrame = presentation.Slides[0].Shapes.AddPictureFrame(
ShapeType.Rectangle, 100, 100, 420, 250, newImage);
// Recorta la imagen (valores de porcentaje)
picFrame.PictureFormat.CropLeft = 23.6f;
picFrame.PictureFormat.CropRight = 21.5f;
picFrame.PictureFormat.CropTop = 3;
picFrame.PictureFormat.CropBottom = 31;
// Guarda el resultado
presentation.Save("PictureFrameCrop.pptx", SaveFormat.Pptx);
}
Eliminar Áreas Recortadas de una Imagen
Si deseas eliminar las áreas recortadas de una imagen contenida en un marco, puedes usar el método IPictureFillFormat.DeletePictureCroppedAreas. Este método devuelve la imagen recortada o la imagen original si el recorte no es necesario.
Este código C# demuestra la operación:
using (Presentation presentation = new Presentation("PictureFrameCrop.pptx"))
{
ISlide slide = presentation.Slides[0];
// Obtiene el PictureFrame de la primera diapositiva
IPictureFrame picFrame = slide.Shapes[0] as IPictureFrame;
// Elimina las áreas recortadas de la imagen del PictureFrame y devuelve la imagen recortada
IPPImage croppedImage = picFrame.PictureFormat.DeletePictureCroppedAreas();
// Guarda el resultado
presentation.Save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
}
NOTE
El método IPictureFillFormat.DeletePictureCroppedAreas agrega la imagen recortada a la colección de imágenes de la presentación. Si la imagen se usa solo en el PictureFrame procesado, esta configuración puede reducir el tamaño de la presentación. De lo contrario, aumentará el número de imágenes en la presentación resultante.
Este método convierte los metarchivos WMF/EMF a imágenes PNG raster en la operación de recorte.
Comprimir Imágenes
Puedes comprimir una imagen en una presentación usando el método IPictureFillFormat.CompressImage.
Este método comprime una imagen reduciendo su tamaño según el tamaño de la forma y la resolución especificada, con la opción de eliminar áreas recortadas.
Ajusta el tamaño y la resolución de la imagen de forma similar a la característica Formato de Imagen → Comprimir Imágenes → Resolución de PowerPoint.
Los siguientes ejemplos en C# demuestran cómo comprimir una imagen en una presentación especificando una resolución objetivo y, opcionalmente, eliminando áreas recortadas:
using (Presentation presentation = new Presentation("demo.pptx"))
{
ISlide slide = presentation.Slides[0];
// Obtiene el PictureFrame de la diapositiva
IPictureFrame picFrame = slide.Shapes[0] as IPictureFrame;
// Comprime la imagen con una resolución objetivo de 150 DPI (resolución web) y elimina áreas recortadas
bool result = picFrame.PictureFormat.CompressImage(true, PicturesCompression.Dpi150);
// Verifica el resultado de la compresión
if (result)
{
Console.WriteLine("Image successfully compressed.");
}
else
{
Console.WriteLine("Image compression failed or no changes were necessary.");
}
}
O usando un valor DPI personalizado directamente:
using (Presentation presentation = new Presentation("demo.pptx"))
{
ISlide slide = presentation.Slides[0];
IPictureFrame picFrame = slide.Shapes[0] as IPictureFrame;
// Comprime la imagen a 150 DPI (resolución web), eliminando áreas recortadas
bool result = picFrame.PictureFormat.CompressImage(true, 150f);
}
NOTE
El método convierte la imagen a una resolución inferior según el tamaño de la forma y el DPI proporcionado. Las regiones recortadas también pueden eliminarse para optimizar el tamaño del archivo.Si la imagen es un metarchivo (WMF/EMF) o SVG, no se aplicará compresión. Además, la calidad JPEG se conserva o se reduce ligeramente según la resolución, de forma similar a cómo PowerPoint maneja JPEGs de alta resolución.
Bloquear Relación de Aspecto
Si deseas que una forma que contiene una imagen mantenga su relación de aspecto incluso después de cambiar las dimensiones de la imagen, puedes usar la propiedad IPictureFrameLock.AspectRatioLocked para establecer la configuración Bloquear relación de aspecto.
Este código C# muestra cómo bloquear la relación de aspecto de una 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);
// Establece que la forma preserve la relación de aspecto al cambiar el tamaño
pictureFrame.PictureFrameLock.AspectRatioLocked = true;
}
NOTE
Esta configuración Bloquear relación de aspecto conserva solo la relación de aspecto de la forma y no la de la imagen que contiene.Usar la Propiedad StretchOff
Usando las propiedades StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight y StretchOffsetBottom de la interfaz IPictureFillFormat y la clase PictureFillFormat, puedes especificar un rectángulo de relleno.
Cuando se especifica estiramiento para una imagen, un rectángulo de origen se escala para ajustarse al rectángulo de relleno especificado. Cada borde del rectángulo de relleno se define mediante un desplazamiento porcentual desde el borde correspondiente del cuadro delimitador de la forma. Un porcentaje positivo indica una inserción mientras que un porcentaje negativo indica una expansión.
- Crea una instancia de la clase Presentation .
- Obtén una referencia a una diapositiva a través de su índice.
- Añade un rectángulo
AutoShape. - Crea una imagen.
- Establece el tipo de relleno de la forma.
- Establece el modo de relleno de imagen de la forma.
- Añade una imagen establecida para rellenar la forma.
- Especifica los desplazamientos de la imagen desde el borde correspondiente del cuadro delimitador de la forma
- Guarda la presentación modificada como un archivo PPTX.
Este código C# muestra un proceso en el que se utiliza la propiedad 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);
// Establece la imagen estirada desde cada lado en el cuerpo de la 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);
}
Preguntas frecuentes
¿Cómo puedo saber qué formatos de imagen son compatibles con PictureFrame?
Aspose.Slides admite tanto imágenes raster (PNG, JPEG, BMP, GIF, etc.) como imágenes vectoriales (por ejemplo, SVG) mediante el objeto de imagen asignado a un PictureFrame. La lista de formatos compatibles generalmente se superpone con las capacidades del motor de conversión de diapositivas e imágenes.
¿Cómo afectará la incorporación de decenas de imágenes grandes al tamaño y rendimiento del PPTX?
Incrustar imágenes grandes aumenta el tamaño del archivo y el uso de memoria; enlazar imágenes ayuda a mantener bajo el tamaño de la presentación pero requiere que los archivos externos permanezcan accesibles. Aspose.Slides permite agregar imágenes mediante enlace para reducir el tamaño del archivo.
¿Cómo puedo bloquear un objeto de imagen para que no se mueva o redimensione accidentalmente?
Utiliza los bloqueos de forma (shape locks) para un PictureFrame (por ejemplo, desactivar mover o redimensionar). El mecanismo de bloqueo se describe para formas en un artículo de protección separado y es compatible con varios tipos de formas, incluido PictureFrame.
¿Se conserva la fidelidad vectorial SVG al exportar una presentación a PDF/imágenes?
Aspose.Slides permite extraer un SVG de un PictureFrame como el vector original. Al exportar a PDF o a formatos raster, el resultado puede rasterizarse según la configuración de exportación; el hecho de que el SVG original se almacene como vector se confirma mediante el comportamiento de extracción.