Gestionar marcos de imagen en presentaciones usando PHP
Introducción
Un marco de imagen es una forma que contiene una imagen—es como una foto dentro de un marco.
Puede agregar una imagen a una diapositiva mediante un marco de imagen. De este modo, formatea 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
- Cree una instancia de la clase Presentation.
- Obtenga una referencia a una diapositiva mediante su índice.
- Cree un objeto PPImage añadiendo una imagen a la ImageCollection asociada al objeto de presentación que se usará para rellenar la forma.
- Especifique el ancho y alto de la imagen.
- Cree un PictureFrame basado en el ancho y alto de la imagen mediante el método
addPictureFrameexpuesto por el objeto de forma asociado a la diapositiva referenciada. - Añada el marco de imagen (que contiene la foto) a la diapositiva.
- Guarde la presentación modificada como archivo PPTX.
Este código PHP muestra cómo crear un marco de imagen:
# Instancia la clase Presentation que representa un archivo PPTX
$pres = new Presentation();
try {
# Obtiene la primera diapositiva
$sld = $pres->getSlides()->get_Item(0);
# Instancia la clase Image
$imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
# Añade un marco de imagen con la altura y anchura equivalentes de la imagen
$sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
# Escribe el archivo PPTX en disco
$pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Crear un Marco de Imagen con Escala Relativa
Al modificar el escalado relativo de una imagen, puede crear un marco de imagen más complejo.
- Cree una instancia de la clase Presentation.
- Obtenga una referencia a una diapositiva mediante su índice.
- Añada una imagen a la colección de imágenes de la presentación.
- Cree un objeto PPImage añadiendo una imagen a la ImageCollection asociada al objeto de presentación que se usará para rellenar la forma.
- Especifique el ancho y alto relativos de la imagen en el marco de imagen.
- Guarde la presentación modificada como archivo PPTX.
Este código PHP muestra cómo crear un marco de imagen con escala relativa:
# Instancia la clase Presentation que representa el PPTX
$pres = new Presentation();
try {
# Obtiene la primera diapositiva
$sld = $pres->getSlides()->get_Item(0);
# Instancia la clase Image
$imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
# Añade un marco de imagen con la altura y anchura equivalentes de la imagen
$pf = $sld->getShapes()->addPictureFrame(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);
# Escribe el archivo PPTX en disco
$pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Extraer Imágenes Rasterizadas de Marcos de Imagen
Puede extraer imágenes rasterizadas de objetos PictureFrame y guardarlas en PNG, JPG y otros formatos. El ejemplo de código a continuación demuestra cómo extraer una imagen del documento “sample.pptx” y guardarla en formato PNG.
$presentation = new Presentation("sample.pptx");
try {
$firstSlide = $presentation->getSlides()->get_Item(0);
$firstShape = $firstSlide->getShapes()->get_Item(0);
if (java_instanceof($firstShape, new JavaClass("com.aspose.slides.PictureFrame"))) {
$pictureFrame = $firstShape;
try {
$slideImage = $pictureFrame->getPictureFormat()->getPicture()->getImage()->getImage();
$slideImage->save("slide_1_shape_1.png", ImageFormat::Png);
} finally {
if (!java_is_null($slideImage)) {
$slideImage->dispose();
}
}
}
} catch (JavaException $e) {
} finally {
$presentation->dispose();
}
Extraer Imágenes SVG de Marcos de Imagen
Cuando una presentación contiene gráficos SVG insertados dentro de formas PictureFrame, Aspose.Slides for PHP via Java le permite recuperar las imágenes vectoriales originales con total fidelidad. Al recorrer la colección de formas de la diapositiva, puede 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:
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
if (java_instanceof($shape, new JavaClass("com.aspose.slides.PictureFrame"))) {
$svgImage = $shape->getPictureFormat()->getPicture()->getImage()->getSvgImage();
if ($svgImage !== null) {
file_put_contents("output.svg", $svgImage->getSvgData());
}
}
} finally {
$presentation->dispose();
}
Obtener Transparencia de una Imagen
Aspose.Slides le permite obtener el efecto de transparencia aplicado a una imagen. Este código PHP demuestra la operación:
$presentation = new Presentation("Test.pptx");
$pictureFrame = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
$imageTransform = $pictureFrame->getPictureFormat()->getPicture()->getImageTransform();
foreach($imageTransform as $effect) {
if (java_instanceof($effect, new JavaClass("com.aspose.slides.AlphaModulateFixed"))) {
$alphaModulateFixed = $effect;
$transparencyValue = 100 - $alphaModulateFixed->getAmount();
echo("Picture transparency: " . $transparencyValue);
}
}
Obtener Brillo y Contraste de una Imagen
Aspose.Slides le permite obtener los efectos de brillo y contraste aplicados a una imagen. La clase Luminance representa este efecto de transformación de imagen.
Este código PHP muestra cómo obtener los ajustes de brillo y contraste de un marco de imagen:
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
$pictureFrame = $shape;
$imageTransform = $pictureFrame->getPictureFormat()->getPicture()->getImageTransform();
$imageTransformCount = java_values($imageTransform->size());
for ($index = 0; $index < $imageTransformCount; $index++) {
$effect = $imageTransform->get_Item($index);
if (java_instanceof($effect, new JavaClass("com.aspose.slides.Luminance"))) {
$luminance = $effect->getEffective();
$brightness = java_values($luminance->getBrightness());
$contrast = java_values($luminance->getContrast());
echo("Brightness: " . $brightness . PHP_EOL);
echo("Contrast: " . $contrast . PHP_EOL);
}
}
} finally {
$presentation->dispose();
}
Formato de Marco de Imagen
Aspose.Slides ofrece numerosas opciones de formato que pueden aplicarse a un marco de imagen. Con esas opciones, puede modificar un marco de imagen para que cumpla requisitos específicos.
- Cree una instancia de la clase Presentation.
- Obtenga una referencia a una diapositiva mediante su índice.
- Cree un objeto PPImage añadiendo una imagen a la ImageCollection asociada al objeto de presentación que se usará para rellenar la forma.
- Especifique el ancho y alto de la imagen.
- Cree un
PictureFramebasado en el ancho y alto de la imagen mediante el método addPictureFrame expuesto por el objeto ShapeCollection asociado a la diapositiva referenciada. - Añada el marco de imagen (que contiene la foto) a la diapositiva.
- Establezca el color de línea del marco de imagen.
- Establezca el ancho de línea del marco de imagen.
- 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.
- Añada el marco de imagen (que contiene la foto) a la diapositiva.
- Guarde la presentación modificada como archivo PPTX.
Este código PHP demuestra el proceso de formato de un marco de imagen:
# Instancia la clase Presentation que representa el PPTX
$pres = new Presentation();
try {
# Obtiene la primera diapositiva
$sld = $pres->getSlides()->get_Item(0);
# Instancia la clase Image
$imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
# Añade un Marco de Imagen con la altura y anchura equivalentes de la imagen
$pf = $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
# Aplica algo de formato a PictureFrameEx
$pf->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$pf->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
$pf->getLineFormat()->setWidth(20);
$pf->setRotation(45);
# Escribe el archivo PPTX en disco
$pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Tip
Aspose ha desarrollado recientemente un Collage Maker gratuito. Si necesita fusionar imágenes JPG/JPEG o PNG, o crear rejillas a partir de fotos, puede usar este servicio.Agregar 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 la presentación. Este código PHP muestra cómo agregar una imagen y un vídeo a un marcador de posición:
$presentation = new Presentation("input.pptx");
try {
$shapesToRemove = new Java("java.util.ArrayList");
$shapesCount = $presentation->getSlides()->get_Item(0)->getShapes()->size();
for($i = 0; $i < java_values($shapesCount) ; $i++) {
$autoShape = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item($i);
if (java_is_null($autoShape->getPlaceholder())) {
continue;
}
switch ($autoShape->getPlaceholder()->getType()) {
case PlaceholderType::Picture :
$pictureFrame = $presentation->getSlides()->get_Item(0)->getShapes()->addPictureFrame(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 PlaceholderType::Media :
$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;
}
}
foreach($shapesToRemove as $shape) {
$presentation->getSlides()->get_Item(0)->getShapes()->remove($shape);
}
$presentation->save("output.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
Recortar Imágenes
Este código PHP muestra cómo recortar una imagen existente en una diapositiva:
$pres = new Presentation();
# Crea un nuevo objeto de imagen
try {
$picture;
$image = Images->fromFile($imagePath);
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
# Añade un PictureFrame a una diapositiva
$picFrame = $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(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, SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Eliminar Áreas Recortadas de una Imagen
Si desea eliminar las áreas recortadas de una imagen contenida en un marco, puede 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 PHP demuestra la operación:
$presentation = new Presentation("PictureFrameCrop.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
# Obtiene el PictureFrame de la primera diapositiva
$picFrame = $slide->getShapes()->get_Item(0);
# Elimina las áreas recortadas de la imagen del PictureFrame y devuelve la imagen recortada
$croppedImage = $picFrame->getPictureFormat()->deletePictureCroppedAreas();
# Guarda el resultado
$presentation->save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
NOTE
El método deletePictureCroppedAreas() agrega la imagen recortada a la colección de imágenes de la presentación. Si la imagen solo se usa en el PictureFrame procesado, esta configuración puede reducir el tamaño de la presentación. En caso contrario, el número de imágenes en la presentación resultante aumentará.
Este método convierte metarchivos WMF/EMF a imágenes PNG raster en la operación de recorte.
Comprimir Imágenes
Puede comprimir una imagen en una presentación mediante el método PictureFillFormat::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 manera similar a la función Formato de Imagen → Comprimir imágenes → Resolución de PowerPoint.
Los siguientes ejemplos PHP demuestran cómo comprimir una imagen en una presentación especificando una resolución objetivo y, opcionalmente, eliminando áreas recortadas:
$presentation = new Presentation("demo.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$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.
$result = $pictureFrame->getPictureFormat()->compressImage(true, PicturesCompression::Dpi150);
# Comprueba el resultado de la compresión.
if ($result) {
echo "Image successfully compressed.";
} else {
echo "Image compression failed or no changes were necessary.";
}
$presentation->save("CompressedImage.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
O utilizando directamente un valor DPI personalizado:
$presentation = new Presentation("demo.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$pictureFrame = $slide->getShapes()->get_Item(0);
# Comprime la imagen a 150 DPI (resolución web), eliminando áreas recortadas.
$pictureFrame->getPictureFormat()->compressImage(true, 150.0);
$presentation->save("CompressedImage.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
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, la compresión no se aplicará. Además, la calidad JPEG se mantiene o se reduce ligeramente según la resolución, de forma similar a como PowerPoint maneja los JPEG de alta resolución.
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 usar el método setAspectRatioLocked para establecer la opción Bloquear relación de aspecto.
Este código PHP muestra cómo bloquear la relación de aspecto de una forma:
$pres = new Presentation("pres.pptx");
try {
$layout = $pres->getLayoutSlides()->getByType(SlideLayoutType::Custom);
$emptySlide = $pres->getSlides()->addEmptySlide($layout);
$picture;
$image = Images->fromFile("image.png");
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
$pictureFrame = $emptySlide->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $presImage->getWidth(), $presImage->getHeight(), $picture);
# establecer la forma para que preserve la relación de aspecto al redimensionar
$pictureFrame->getPictureFrameLock()->setAspectRatioLocked(true);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
NOTE
Esta opción Bloquear relación de aspecto sólo conserva la relación de aspecto de la forma y no la de la imagen que contiene.Utilizar la Propiedad StretchOff
Usando los métodos setStretchOffsetLeft, setStretchOffsetTop, setStretchOffsetRight y setStretchOffsetBottom de la clase PictureFillFormat, puede especificar un rectángulo de relleno.
Cuando se especifica un 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.
- Cree una instancia de la clase Presentation.
- Obtenga una referencia a una diapositiva mediante su índice.
- Añada un rectángulo
AutoShape. - Cree una imagen.
- Establezca el tipo de relleno de la forma.
- Establezca el modo de relleno de imagen de la forma.
- Asigne la imagen para rellenar la forma.
- Especifique los desplazamientos de la imagen respecto al borde correspondiente del cuadro delimitador de la forma.
- Guarde la presentación modificada como archivo PPTX.
Este código PHP demuestra un proceso en el que se utiliza la propiedad StretchOff:
# Instancia la clase Presentation que representa un archivo PPTX
$pres = new Presentation();
try {
# Obtiene la primera diapositiva
$slide = $pres->getSlides()->get_Item(0);
# Instancia la clase ImageEx
$picture;
$image = Images->fromFile("aspose-logo.jpg");
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
# Añade un AutoShape configurado como Rectangle
$aShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
# Establece el tipo de relleno de la forma
$aShape->getFillFormat()->setFillType(FillType::Picture);
# Establece el modo de relleno de imagen de la forma
$aShape->getFillFormat()->getPictureFillFormat()->setPictureFillMode(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", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
FAQ
¿Cómo puedo averiguar qué formatos de imagen son compatibles con PictureFrame?
Aspose.Slides admite tanto imágenes rasterizadas (PNG, JPEG, BMP, GIF, etc.) como imágenes vectoriales (por ejemplo, SVG) a través del 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 afecta la incorporación de decenas de imágenes grandes al tamaño y rendimiento del 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 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 bloqueos de forma para un PictureFrame (por ejemplo, deshabilitar el movimiento o el redimensionado). El mecanismo de bloqueo es compatible con varios tipos de forma, incluido el 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 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.