Gestionar marcos de imagen en presentaciones en .NET

Introducción

Un marco de imagen es una forma que contiene una imagen; es como una foto dentro de un marco.

Puede añadir una imagen a una diapositiva mediante un marco de imagen. De este modo, puede dar formato a la imagen formateando el marco de imagen.

Crear un Marco de Imagen

  1. Cree una instancia de la clase Presentation.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Cree un objeto IPPImage añadiendo una imagen a la IImagescollection asociada al objeto presentación que se utilizará para rellenar la forma.
  4. Especifique el ancho y la altura de la imagen.
  5. Cree un PictureFrame basado en el ancho y la altura de la imagen mediante el método AddPictureFrame expuesto por el objeto de forma asociado a la diapositiva referenciada.
  6. Añada un marco de imagen (que contiene la foto) a la diapositiva.
  7. Guarde 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 añade 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();

        // Añade 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;

        // Guarda la presentación en un archivo PPTX
        pres.Save("RectPicFrameFormat_out.pptx", SaveFormat.Pptx);
    }

Crear un Marco de Imagen con Escala Relativa

Al modificar la escala relativa de una imagen, puede crear un marco de imagen más complejo.

  1. Cree una instancia de la clase Presentation.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Añada una imagen a la colección de imágenes de la presentación.
  4. Cree un objeto IPPImage añadiendo una imagen a la IImagescollection asociada al objeto presentación que se utilizará para rellenar la forma.
  5. Especifique el ancho y la altura relativos de la imagen en el marco de imagen.
  6. Guarde 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 añade 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();

    // Añade 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 altura
    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 Raster de Marcos de Imagen

Puede extraer imágenes raster 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 Marcos de Imagen

Cuando una presentación contiene gráficos SVG colocados dentro de formas PictureFrame, Aspose.Slides para .NET le permite recuperar las imágenes vectoriales originales con total fidelidad. Recorriendo la colección de formas de la diapositiva, puede 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 la Transparencia de una Imagen

Aspose.Slides le 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);
        }
    }
}

Obtener Brillo y Contraste de una Imagen

Aspose.Slides le permite obtener el efecto de brillo y contraste aplicado a una imagen. La interfaz ILuminance representa este efecto de transformación de la imagen.

Este código C# muestra cómo obtener los ajustes de brillo y contraste de un marco de imagen:

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);
        }
    }
}

Formato del Marco de Imagen

Aspose.Slides ofrece muchas opciones de formato que pueden aplicarse a un marco de imagen. Usando esas opciones, puede modificar un marco de imagen para que cumpla requisitos específicos.

  1. Cree una instancia de la clase Presentation.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Cree un objeto IPPImage añadiendo una imagen a la IImagescollection asociada al objeto presentación que se utilizará para rellenar la forma.
  4. Especifique el ancho y la altura de la imagen.
  5. Cree un PictureFrame basado en el ancho y la altura de la imagen mediante el método AddPictureFrame expuesto por el objeto IShapes asociado a la diapositiva referenciada.
  6. Añada el marco de imagen (que contiene la foto) a la diapositiva.
  7. Establezca el color de línea del marco de imagen.
  8. Establezca el ancho de línea del marco de imagen.
  9. Gire el marco de imagen asignándole un valor positivo o negativo.
    • Un valor positivo gira la imagen en sentido horario.
    • Un valor negativo gira la imagen en sentido antihorario.
  10. Añada el marco de imagen (que contiene la foto) a la diapositiva.
  11. Guarde la presentación modificada como un archivo PPTX.

Este código C# muestra el proceso de formato 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 añade 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();

    // Añade un marco de imagen con la altura y anchura equivalentes 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;

    // Guarda la presentación en un archivo PPTX
    presentation.Save("RectPicFrameFormat_out.pptx", SaveFormat.Pptx);
}

Añadir una Imagen como Enlace

Para evitar presentaciones de gran tamaño, puede añadir imágenes (o videos) mediante enlaces en lugar de incrustar los archivos directamente en las presentaciones. Este código C# muestra cómo añadir 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();

    // Añade un PictureFrame a una diapositiva
    IPictureFrame picFrame = presentation.Slides[0].Shapes.AddPictureFrame(
        ShapeType.Rectangle, 100, 100, 420, 250, newImage);

    // Recorta la imagen (valores en 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 desea eliminar las áreas recortadas de una imagen contenida en un marco, puede utilizar 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);
}

Comprimir Imágenes

Puede comprimir una imagen en una presentación mediante el método IPictureFillFormat.CompressImage. Este método comprime una imagen reduciendo su tamaño en función del 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 función 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];
    IPictureFrame pictureFrame = slide.Shapes[0] as IPictureFrame;

    // Comprima la imagen con una resolución objetivo de 150 DPI (resolución web) y elimine las áreas recortadas.
    bool result = pictureFrame.PictureFormat.CompressImage(true, PicturesCompression.Dpi150);

    // Compruebe el resultado de la compresión.
    if (result)
    {
        Console.WriteLine("Image successfully compressed.");
    }
    else
    {
        Console.WriteLine("Image compression failed or no changes were necessary.");
    }

    presentation.Save("CompressedImage.pptx", SaveFormat.Pptx);
}

O usando directamente un valor DPI personalizado:

using (Presentation presentation = new Presentation("demo.pptx"))
{
    ISlide slide = presentation.Slides[0];
    IPictureFrame pictureFrame = slide.Shapes[0] as IPictureFrame;

    // Comprima la imagen a 150 DPI (resolución web), eliminando áreas recortadas.
    pictureFrame.PictureFormat.CompressImage(true, 150f);

    presentation.Save("CompressedImage.pptx", SaveFormat.Pptx);
}

Bloquear Relación de Aspecto

Si desea que una forma que contiene una imagen mantenga su relación de aspecto incluso después de cambiar las dimensiones de la imagen, puede utilizar la propiedad IPictureFrameLock.AspectRatioLocked para establecer la opció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 la forma para preservar la relación de aspecto al redimensionar
    pictureFrame.PictureFrameLock.AspectRatioLocked = true;
}

Usar la Propiedad StretchOff

Usando las propiedades StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight y StretchOffsetBottom de la interfaz IPictureFillFormat y la clase PictureFillFormat, puede 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 salida.

  1. Cree una instancia de la Presentation class.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Añada un rectángulo AutoShape.
  4. Cree una imagen.
  5. Establezca el tipo de relleno de la forma.
  6. Establezca el modo de relleno de imagen de la forma.
  7. Añada una imagen establecida para rellenar la forma.
  8. Especifique los desplazamientos de la imagen desde el borde correspondiente del cuadro delimitador de la forma
  9. Guarde 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();

    IPictureFrame 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) a través del objeto de imagen que se asigna 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 reducido el tamaño de la presentación, pero requiere que los archivos externos permanezcan accesibles. Aspose.Slides ofrece la posibilidad de añadir 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?

Utilice los bloqueos de forma para un PictureFrame (por ejemplo, desactivar el movimiento o el redimensionado). El mecanismo de bloqueo se describe para las formas en un artículo de protección separado y es compatible con varios tipos de forma, incluido el PictureFrame.

¿Se conserva la fidelidad vectorial del SVG al exportar una presentación a PDF/imagenes?

Aspose.Slides permite extraer un SVG de un PictureFrame como el vector original. Al exportar a PDF o a formatos rasterizados, 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.