Gestionar marcos de imagen en presentaciones usando JavaScript

Introducción

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

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

Crear marco de imagen

  1. Crea una instancia de la clase Presentation.
  2. Obtén una referencia a una diapositiva mediante su índice.
  3. Crea un objeto PPImage añadiendo una imagen a la ImagesCollection asociada al objeto presentation que se utilizará para rellenar la forma.
  4. Especifica el ancho y la altura de la imagen.
  5. Crea un PictureFrame basado en el ancho y la altura de la imagen mediante el método addPictureFrame expuesto por el objeto shape asociado a la diapositiva referenciada.
  6. Añade un marco de imagen (que contiene la foto) a la diapositiva.
  7. Guarda la presentación modificada como archivo PPTX.

Este código JavaScript muestra cómo crear un marco de imagen:

// Instancia la clase Presentation que representa un archivo PPTX
var pres = new aspose.slides.Presentation();
try {
    // Obtiene la primera diapositiva
    var sld = pres.getSlides().get_Item(0);
    // Instancia la clase Image
    var imgx = pres.getImages().addImage(java.newInstanceSync("java.io.FileInputStream", java.newInstanceSync("java.io.File", "asp1.jpg")));
    // Añade un marco de imagen con la altura y el ancho equivalentes de la imagen
    sld.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    // Guarda el archivo PPTX en disco
    pres.save("RectPicFrame.pptx", aspose.slides.SaveFormat.Pptx);
} catch (e) {console.log(e);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Los marcos de imagen te permiten crear rápidamente diapositivas de presentación basadas en imágenes. Cuando combinas un marco de imagen con las opciones de guardado de Aspose.Slides, puedes manipular operaciones de entrada/salida para convertir imágenes de un formato a otro.

Crear marco de imagen con escala relativa

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

  1. Crea una instancia de la clase Presentation.
  2. Obtén una referencia a una diapositiva mediante su índice.
  3. Añade una imagen a la colección de imágenes de la presentación.
  4. Crea un objeto PPImage añadiendo una imagen a la ImagesCollection asociada al objeto presentation que se utilizará para rellenar la forma.
  5. Especifica el ancho y la altura relativos de la imagen en el marco de imagen.
  6. Guarda la presentación modificada como archivo PPTX.

Este código JavaScript muestra cómo crear un marco de imagen con escala relativa:

// Instancia la clase Presentation que representa el PPTX
var pres = new aspose.slides.Presentation();
try {
    // Obtiene la primera diapositiva
    var sld = pres.getSlides().get_Item(0);
    // Instancia la clase Image
    var imgx = pres.getImages().addImage(java.newInstanceSync("java.io.FileInputStream", java.newInstanceSync("java.io.File", "asp1.jpg")));
    // Añade un marco de imagen con la altura y anchura equivalentes de la imagen
    var pf = sld.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    // Establece la escala relativa de ancho y alto
    pf.setRelativeScaleHeight(0.8);
    pf.setRelativeScaleWidth(1.35);
    // Guarda el archivo PPTX en disco
    pres.save("RectPicFrame.pptx", aspose.slides.SaveFormat.Pptx);
} catch (e) {console.log(e);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Extraer imágenes rasterizadas de 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.

var presentation = new aspose.slides.Presentation("sample.pptx");
try {
    var firstSlide = presentation.getSlides().get_Item(0);
    var firstShape = firstSlide.getShapes().get_Item(0);
    if (java.instanceOf(firstShape, "com.aspose.slides.IPictureFrame")) {
        var pictureFrame = firstShape;
        try {
            var slideImage = pictureFrame.getPictureFormat().getPicture().getImage().getImage();
            slideImage.save("slide_1_shape_1.png", aspose.slides.ImageFormat.Png);
        } finally {
            if (slideImage != null) {
                slideImage.dispose();
            }
        }
    }
} catch (e) {console.log(e);
} finally {
    presentation.dispose();
}

Extraer imágenes SVG de marcos de imagen

Cuando una presentación contiene gráficos SVG ubicados dentro de formas PictureFrame, Aspose.Slides para Node.js mediante Java te permite recuperar las imágenes vectoriales originales con total fidelidad. Al recorrer la colección de formas de la diapositiva, puedes identificar cada PictureFrame, comprobar si el PPImage 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:

var presentation = new aspose.slides.Presentation("sample.pptx");

try {
    var slide = presentation.getSlides().get_Item(0);
    var shape = slide.getShapes().get_Item(0);

    if (java.instanceOf(shape, "com.aspose.slides.IPictureFrame")) {
        const svgImage = shape.getPictureFormat().getPicture().getImage().getSvgImage();

        if (svgImage) {
            fs.writeFileSync("output.svg", svgImage.getSvgData());
        }
    }
} catch (e) {
    console.log(e);
} finally {
    presentation.dispose();
}

Obtener transparencia de una imagen

Aspose.Slides permite obtener el efecto de transparencia aplicado a una imagen. Este código JavaScript demuestra la operación:

var presentation = new aspose.slides.Presentation("Test.pptx");
var pictureFrame = presentation.getSlides().get_Item(0).getShapes().get_Item(0);
var imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
for (var i = 0; i < imageTransform.size(); i++) {
    var effect = imageTransform.get_Item(i);
    if (java.instanceOf(effect, "com.aspose.slides.IAlphaModulateFixed")) {
        var alphaModulateFixed = effect;
        var transparencyValue = 100 - alphaModulateFixed.getAmount();
        console.log("Picture transparency: " + transparencyValue);
    }
}

Obtener brillo y contraste de una imagen

Aspose.Slides permite obtener el efecto de brillo y contraste aplicado a una imagen. La clase Luminance representa este efecto de transformación de imagen.

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

const presentation = new aspose.slides.Presentation("sample.pptx");

try {
    const slide = presentation.getSlides().get_Item(0);
    const shape = slide.getShapes().get_Item(0);
    const pictureFrame = shape;

    const imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
    for (let i = 0; i < imageTransform.size(); i++) {
        const effect = imageTransform.get_Item(i);
        if (java.instanceOf(effect, "com.aspose.slides.Luminance")) {
            const luminance = effect.getEffective();
            const brightness = luminance.getBrightness();
            const contrast = luminance.getContrast();

            console.log("Brightness: " + brightness);
            console.log("Contrast: " + contrast);
        }
    }
} finally {
    presentation.dispose();
}

Formato de marco de imagen

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

  1. Crea una instancia de la clase Presentation.
  2. Obtén una referencia a una diapositiva mediante su índice.
  3. Crea un objeto PPImage añadiendo una imagen a la ImagesCollection asociada al objeto presentation que se utilizará para rellenar la forma.
  4. Especifica el ancho y la altura de la imagen.
  5. Crea un PictureFrame basado en el ancho y la altura de la imagen mediante el método addPictureFrame expuesto por el objeto Shapes asociado a la diapositiva referenciada.
  6. Añade el marco de imagen (que contiene la foto) a la diapositiva.
  7. Establece el color de línea del marco de imagen.
  8. Establece el ancho de línea del marco de imagen.
  9. Gira el marco de imagen asignándole un valor positivo o negativo.
    • Un valor positivo rota la imagen en sentido horario.
    • Un valor negativo rota la imagen en sentido antihorario.
  10. Añade el marco de imagen (que contiene la foto) a la diapositiva.
  11. Guarda la presentación modificada como archivo PPTX.

Este código JavaScript muestra el proceso de formato del marco de imagen:

// Instancia la clase Presentation que representa el PPTX
var pres = new aspose.slides.Presentation();
try {
    // Obtiene la primera diapositiva
    var sld = pres.getSlides().get_Item(0);
    // Instancia la clase Image
    var imgx = pres.getImages().addImage(java.newInstanceSync("java.io.FileInputStream", java.newInstanceSync("java.io.File", "asp1.jpg")));
    // Añade un marco de imagen con la altura y anchura equivalentes de la imagen
    var pf = sld.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    // Aplica algo de formato a PictureFrameEx
    pf.getLineFormat().getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
    pf.getLineFormat().getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "BLUE"));
    pf.getLineFormat().setWidth(20);
    pf.setRotation(45);
    // Escribe el archivo PPTX en disco
    pres.save("RectPicFrame.pptx", aspose.slides.SaveFormat.Pptx);
} catch (e) {console.log(e);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Añadir imagen como enlace

Para evitar presentaciones de gran tamaño, puedes añadir imágenes (o vídeos) mediante enlaces en lugar de incrustar los archivos directamente en las presentaciones. Este código JavaScript muestra cómo añadir una imagen y un vídeo en un marcador de posición:

var presentation = new aspose.slides.Presentation("input.pptx");
try {
    var shapesToRemove = java.newInstanceSync("java.util.ArrayList");
    var shapesCount = presentation.getSlides().get_Item(0).getShapes().size();
    for (var i = 0; i < shapesCount; i++) {
        var autoShape = presentation.getSlides().get_Item(0).getShapes().get_Item(i);
        if (autoShape.getPlaceholder() == null) {
            continue;
        }
        switch (autoShape.getPlaceholder().getType()) {
            case aspose.slides.PlaceholderType.Picture :
                var pictureFrame = presentation.getSlides().get_Item(0).getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, autoShape.getX(), autoShape.getY(), autoShape.getWidth(), autoShape.getHeight(), null);
                pictureFrame.getPictureFormat().getPicture().setLinkPathLong("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 aspose.slides.PlaceholderType.Media :
                var videoFrame = presentation.getSlides().get_Item(0).getShapes().addVideoFrame(autoShape.getX(), autoShape.getY(), autoShape.getWidth(), autoShape.getHeight(), "");
                videoFrame.getPictureFormat().getPicture().setLinkPathLong("https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg");
                videoFrame.setLinkPathLong("https://youtu.be/t_1LYZ102RA");
                shapesToRemove.add(autoShape);
                break;
        }
    }
    for (var i = 0; i < shapesToRemove.length; i++) {
        var shape = shapesToRemove.get_Item(i);
        presentation.getSlides().get_Item(0).getShapes().remove(shape);
    }
    presentation.save("output.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (presentation != null) {
        presentation.dispose();
    }
}

Recortar imagen

Este código JavaScript muestra cómo recortar una imagen existente en una diapositiva:

var pres = new aspose.slides.Presentation();
// Crea un nuevo objeto de imagen
try {
    var picture;
    var image = aspose.slides.Images.fromFile(imagePath);
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) {
            image.dispose();
        }
    }
    // Añade un PictureFrame a una diapositiva
    var picFrame = pres.getSlides().get_Item(0).getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 100, 100, 420, 250, picture);
    // Recorta la imagen (valores en porcentaje)
    picFrame.getPictureFormat().setCropLeft(23.6);
    picFrame.getPictureFormat().setCropRight(21.5);
    picFrame.getPictureFormat().setCropTop(3);
    picFrame.getPictureFormat().setCropBottom(31);
    // Guarda el resultado
    pres.save(outPptxFile, aspose.slides.SaveFormat.Pptx);
} catch (e) {console.log(e);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Eliminar áreas recortadas de la imagen

Si deseas eliminar las áreas recortadas de una imagen contenida en un marco, puedes usar el método deletePictureCroppedAreas() . Este método devuelve la imagen recortada o la imagen original si el recorte no es necesario.

Este código JavaScript demuestra la operación:

var presentation = new aspose.slides.Presentation("PictureFrameCrop.pptx");
try {
    var slide = presentation.getSlides().get_Item(0);
    // Obtiene el PictureFrame de la primera diapositiva
    var picFrame = slide.getShapes().get_Item(0);
    // Elimina las áreas recortadas de la imagen del PictureFrame y devuelve la imagen recortada
    var croppedImage = picFrame.getPictureFormat().deletePictureCroppedAreas();
    // Guarda el resultado
    presentation.save("PictureFrameDeleteCroppedAreas.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (presentation != null) {
        presentation.dispose();
    }
}

Comprimir imágenes

Puedes comprimir una imagen en una presentación usando el método PictureFillFormat.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 JavaScript demuestran cómo comprimir una imagen en una presentación especificando una resolución objetivo y, opcionalmente, eliminando áreas recortadas:

const presentation = new aspose.slides.Presentation("demo.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);
    const pictureFrame = slide.getShapes().get_Item(0);

    // Comprime la imagen con una resolución objetivo de 150 DPI (resolución web) y elimina las áreas recortadas.
    const result = pictureFrame.getPictureFormat().compressImage(true, aspose.slides.PicturesCompression.Dpi150);

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

    presentation.save("CompressedImage.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

O usando otro valor DPI predefinido:

const presentation = new aspose.slides.Presentation("demo.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);
    const pictureFrame = slide.getShapes().get_Item(0);

    // Comprime la imagen a 96 DPI (resolución de correo electrónico), eliminando las áreas recortadas.
    pictureFrame.getPictureFormat().compressImage(true, aspose.slides.PicturesCompression.Dpi96);

    presentation.save("CompressedImage.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Bloquear proporción de aspecto

Si deseas que una forma que contiene una imagen mantenga su proporción de aspecto incluso después de cambiar las dimensiones de la imagen, puedes usar el método setAspectRatioLocked para activar la opción Lock Aspect Ratio.

Este código JavaScript muestra cómo bloquear la proporción de aspecto de una forma:

var pres = new aspose.slides.Presentation("pres.pptx");
try {
    var layout = pres.getLayoutSlides().getByType(aspose.slides.SlideLayoutType.Custom);
    var emptySlide = pres.getSlides().addEmptySlide(layout);
    var picture;
    var image = aspose.slides.Images.fromFile("image.png");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) {
            image.dispose();
        }
    }
    var pictureFrame = emptySlide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 50, 150, presImage.getWidth(), presImage.getHeight(), picture);
    // configurar la forma para mantener la proporción de aspecto al redimensionar
    pictureFrame.getPictureFrameLock().setAspectRatioLocked(true);
} catch (e) {console.log(e);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Utilizar la propiedad StretchOff

Utilizando los métodos setStretchOffsetLeft, setStretchOffsetTop, setStretchOffsetRight y setStretchOffsetBottom de 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 respecto al borde correspondiente del cuadro delimitador de la forma. Un porcentaje positivo indica una inserción, mientras que un porcentaje negativo indica una expansión.

  1. Crea una instancia de la clase Presentation.
  2. Obtén una referencia a una diapositiva mediante su índice.
  3. Añade un rectángulo AutoShape.
  4. Crea una imagen.
  5. Establece el tipo de relleno de la forma.
  6. Establece el modo de relleno de imagen de la forma.
  7. Añade una imagen establecida para rellenar la forma.
  8. Especifica los desplazamientos de la imagen respecto al borde correspondiente del cuadro delimitador de la forma
  9. Guarda la presentación modificada como archivo PPTX.

Este código JavaScript muestra un proceso en el que se utiliza la propiedad StretchOff:

// Instancia la clase Presentation que representa un archivo PPTX
var pres = new aspose.slides.Presentation();
try {
    // Obtiene la primera diapositiva
    var slide = pres.getSlides().get_Item(0);
    // Instancia la clase ImageEx
    var picture;
    var image = aspose.slides.Images.fromFile("aspose-logo.jpg");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) {
            image.dispose();
        }
    }
    // Añade un AutoShape con forma de rectángulo
    var aShape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 300, 300);
    // Establece el tipo de relleno de la forma
    aShape.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Picture));
    // Establece el modo de relleno de imagen de la forma
    aShape.getFillFormat().getPictureFillFormat().setPictureFillMode(aspose.slides.PictureFillMode.Stretch);
    // Establece la imagen para rellenar la forma
    aShape.getFillFormat().getPictureFillFormat().getPicture().setImage(picture);
    // Especifica los desplazamientos de la imagen respecto al borde correspondiente del cuadro delimitador de la forma
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetLeft(25);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetRight(25);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetTop(-20);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetBottom(-10);
    // Escribe el archivo PPTX en disco
    pres.save("StretchOffsetLeftForPictureFrame_out.pptx", aspose.slides.SaveFormat.Pptx);
} catch (e) {console.log(e);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

FAQ

¿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 archivo PPTX?

Incrustar imágenes grandes incrementa 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 permite añadir imágenes mediante enlaces para reducir el tamaño del archivo.

¿Cómo puedo bloquear un objeto de imagen para evitar moverlo o redimensionarlo accidentalmente?

Utiliza los [shape locks] para un PictureFrame (por ejemplo, deshabilitar el movimiento o el redimensionado). El mecanismo de bloqueo es compatible con varios tipos de forma, incluido PictureFrame.

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

Aspose.Slides permite extraer un SVG de un PictureFrame como 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 con el comportamiento de extracción.