Administrar marcos de imagen en presentaciones usando PHP

Un marco de imagen es una forma que contiene una imagen—es como una foto en un marco.

Puede agregar una imagen a una diapositiva mediante un marco de imagen. De esta manera, puede dar formato a la imagen formateando el marco de imagen.

Crear un Marco de Imagen

  1. Cree una instancia de la clase Presentación.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Cree un objeto IPPImage agregando una imagen a la IImagescollection asociada al objeto de presentación que se usará 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. Agregue un marco de imagen (que contiene la foto) a la diapositiva.
  7. Guarde la presentación modificada como un 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")));
    # Agrega 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 la escala relativa de una imagen, puede crear un marco de imagen más complejo.

  1. Cree una instancia de la clase Presentación.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Agregue una imagen a la colección de imágenes de la presentación.
  4. Cree un objeto IPPImage agregando una imagen a la IImagescollection asociada al objeto de presentación que se usará 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 PHP muestra cómo crear un marco de imagen con escala relativa:

  # Instanciar la clase Presentation que representa el PPTX
  $pres = new Presentation();
  try {
    # Obtener la primera diapositiva
    $sld = $pres->getSlides()->get_Item(0);
    # Instanciar la clase Image
    $imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
    # Añadir marco de imagen con altura y anchura equivalentes de la imagen
    $pf = $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
    # Establecer escala relativa de ancho y alto
    $pf->setRelativeScaleHeight(0.8);
    $pf->setRelativeScaleWidth(1.35);
    # Escribir 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 Raster de los 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.

  $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 los Marcos de Imagen

Cuando una presentación contiene gráficos SVG ubicados dentro de formas PictureFrame, Aspose.Slides for PHP via Java 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 luego 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 la Transparencia de una Imagen

Aspose.Slides permite obtener el efecto de transparencia aplicado a una imagen. Este código PHP muestra 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);
    }
  }

Formato de Marco de Imagen

Aspose.Slides ofrece muchas 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.

  1. Cree una instancia de la clase Presentación.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Cree un objeto IPPImage agregando una imagen a la IImagescollection asociada al objeto de presentación que se usará 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. Agregue 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 grosor de línea del marco de imagen.
  9. Gire el marco de imagen proporcionando un valor positivo o negativo.
    • Un valor positivo gira la imagen en sentido horario.
    • Un valor negativo gira la imagen en sentido antihorario.
  10. Agregue el marco de imagen (que contiene la foto) a la diapositiva.
  11. Guarde la presentación modificada como un archivo PPTX.

Este código PHP demuestra el proceso de formato del 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")));
    # Agrega 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 algún 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();
    }
  }

Agregar una Imagen como Enlace

Para evitar tamaños grandes de presentación, puede agregar imágenes (o videos) mediante enlaces en lugar de incrustar los archivos directamente en las presentaciones. Este código PHP muestra cómo agregar una imagen y un video en 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();
      }
    }
    # Agrega 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();
    }
  }

Bloquear la Proporción de Aspecto

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

Este código PHP muestra cómo bloquear la proporció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 preservar la relación de aspecto al redimensionar
    $pictureFrame->getPictureFrameLock()->setAspectRatioLocked(true);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Utilizar 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 fuente 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 un inset mientras que uno negativo indica un outset.

  1. Cree una instancia de la clase Presentation.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Agregue una forma rectangular 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. Agregue una imagen de conjunto para rellenar la forma.
  8. Especifique los desplazamientos de imagen desde el borde correspondiente del cuadro delimitador de la forma.
  9. Guarde la presentación modificada como un 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();
      }
    }
    # Agrega 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 desde el 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();
    }
  }

Preguntas Frecuentes

¿Cómo puedo averiguar 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 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 inserció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?

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

¿Se preserva la fidelidad vectorial 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 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.