Gérer les cadres d'image dans les présentations avec PHP

Un cadre d’image est une forme qui contient une image — c’est comme une image dans un cadre.

Vous pouvez ajouter une image à une diapositive via un cadre d’image. Ainsi, vous pouvez formater l’image en formatant le cadre d’image.

Créer un cadre d’image

  1. Créez une instance de la classe Presentation.
  2. Obtenez une référence à une diapositive via son indice.
  3. Créez un objet IPPImage en ajoutant une image à la IImagescollection associée à l’objet de présentation qui sera utilisé pour remplir la forme.
  4. Spécifiez la largeur et la hauteur de l’image.
  5. Créez un PictureFrame basé sur la largeur et la hauteur de l’image via la méthode AddPictureFrame exposée par l’objet shape associé à la diapositive référencée.
  6. Ajoutez un cadre d’image (contenant la photo) à la diapositive.
  7. Enregistrez la présentation modifiée sous forme de fichier PPTX.

Ce code PHP vous montre comment créer un cadre d’image :

  # Instancie la classe Presentation qui représente un fichier PPTX
  $pres = new Presentation();
  try {
    # Récupère la première diapositive
    $sld = $pres->getSlides()->get_Item(0);
    # Instancie la classe Image
    $imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
    # Ajoute un cadre d'image avec la même hauteur et largeur que l'image
    $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
    # Enregistre le fichier PPTX sur le disque
    $pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Créer un cadre d’image avec échelle relative

En modifiant l’échelle relative d’une image, vous pouvez créer un cadre d’image plus sophistiqué.

  1. Créez une instance de la classe Presentation.
  2. Obtenez une référence à une diapositive via son indice.
  3. Ajoutez une image à la collection d’images de la présentation.
  4. Créez un objet IPPImage en ajoutant une image à la IImagescollection associée à l’objet de présentation qui sera utilisé pour remplir la forme.
  5. Spécifiez la largeur et la hauteur relatives de l’image dans le cadre d’image.
  6. Enregistrez la présentation modifiée sous forme de fichier PPTX.

Ce code PHP vous montre comment créer un cadre d’image avec une échelle relative :

  # Instancie la classe Presentation qui représente le PPTX
  $pres = new Presentation();
  try {
    # Obtient la première diapositive
    $sld = $pres->getSlides()->get_Item(0);
    # Instancie la classe Image
    $imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
    # Ajoute un cadre d'image avec la hauteur et la largeur équivalentes de l'image
    $pf = $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
    # Définit l'échelle relative de la hauteur et de la largeur
    $pf->setRelativeScaleHeight(0.8);
    $pf->setRelativeScaleWidth(1.35);
    # Enregistre le fichier PPTX sur le disque
    $pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Extraire des images matricielles à partir de cadres d’image

Vous pouvez extraire des images matricielles à partir d’objets PictureFrame et les enregistrer au format PNG, JPG et autres. L’exemple de code ci-dessous montre comment extraire une image du document “sample.pptx” et l’enregistrer au format 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();
  }

Extraire des images SVG à partir de cadres d’image

Lorsque une présentation contient des graphiques SVG placés à l’intérieur de formes PictureFrame , Aspose.Slides pour PHP via Java vous permet de récupérer les images vectorielles originales avec une fidélité totale. En parcourant la collection de formes de la diapositive, vous pouvez identifier chaque PictureFrame, vérifier si le PPImage sous-jacent contient du contenu SVG, puis enregistrer cette image sur le disque ou dans un flux dans son format SVG natif.

L’exemple de code suivant montre comment extraire une image SVG d’un cadre d’image :

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

Obtenir la transparence d’une image

Aspose.Slides vous permet d’obtenir l’effet de transparence appliqué à une image. Ce code PHP montre l’opération :

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

Mise en forme du cadre d’image

Aspose.Slides propose de nombreuses options de mise en forme pouvant être appliquées à un cadre d’image. En utilisant ces options, vous pouvez modifier un cadre d’image afin qu’il réponde à des exigences spécifiques.

  1. Créez une instance de la classe Presentation.
  2. Obtenez une référence à une diapositive via son indice.
  3. Créez un objet IPPImage en ajoutant une image à la IImagescollection associée à l’objet de présentation qui sera utilisé pour remplir la forme.
  4. Spécifiez la largeur et la hauteur de l’image.
  5. Créez un PictureFrame basé sur la largeur et la hauteur de l’image via la méthode AddPictureFrame exposée par l’objet IShapes associé à la diapositive référencée.
  6. Ajoutez le cadre d’image (contenant la photo) à la diapositive.
  7. Définissez la couleur du contour du cadre d’image.
  8. Définissez la largeur du contour du cadre d’image.
  9. Faites pivoter le cadre d’image en lui attribuant une valeur positive ou négative.
    • Une valeur positive fait pivoter l’image dans le sens des aiguilles d’une montre.
    • Une valeur négative fait pivoter l’image dans le sens inverse des aiguilles d’une montre.
  10. Ajoutez le cadre d’image (contenant la photo) à la diapositive.
  11. Enregistrez la présentation modifiée sous forme de fichier PPTX.

Ce code PHP démontre le processus de mise en forme du cadre d’image :

  # Instancie la classe Presentation qui représente le PPTX
  $pres = new Presentation();
  try {
    # Obtient la première diapositive
    $sld = $pres->getSlides()->get_Item(0);
    # Instancie la classe Image
    $imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
    # Ajoute un cadre d'image avec la hauteur et la largeur équivalentes de l'image
    $pf = $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
    # Applique un certain formatage à PictureFrameEx
    $pf->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
    $pf->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
    $pf->getLineFormat()->setWidth(20);
    $pf->setRotation(45);
    # Enregistre le fichier PPTX sur le disque
    $pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Ajouter une image sous forme de lien

Pour éviter des tailles de présentation importantes, vous pouvez ajouter des images (ou des vidéos) via des liens au lieu d’intégrer les fichiers directement dans les présentations. Ce code PHP vous montre comment ajouter une image et une vidéo dans un espace réservé :

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

Rogner des images

Ce code PHP vous montre comment rogner une image existante sur une diapositive :

  $pres = new Presentation();
  # Crée un nouvel objet image
  try {
    $picture;
    $image = Images->fromFile($imagePath);
    try {
      $picture = $pres->getImages()->addImage($image);
    } finally {
      if (!java_is_null($image)) {
        $image->dispose();
      }
    }
    # Ajoute un PictureFrame à une diapositive
    $picFrame = $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 100, 100, 420, 250, $picture);
    # Recadre l'image (valeurs en pourcentage)
    $picFrame->getPictureFormat()->setCropLeft(23.6);
    $picFrame->getPictureFormat()->setCropRight(21.5);
    $picFrame->getPictureFormat()->setCropTop(3);
    $picFrame->getPictureFormat()->setCropBottom(31);
    # Enregistre le résultat
    $pres->save($outPptxFile, SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Supprimer les zones rognées d’un cadre

Si vous souhaitez supprimer les zones rognées d’une image contenue dans un cadre, vous pouvez utiliser la méthode deletePictureCroppedAreas() . Cette méthode renvoie l’image rognée ou l’image d’origine si le rognage n’est pas nécessaire.

Ce code PHP démontre l’opération :

  $presentation = new Presentation("PictureFrameCrop.pptx");
  try {
    $slide = $presentation->getSlides()->get_Item(0);
    # Récupère le PictureFrame de la première diapositive
    $picFrame = $slide->getShapes()->get_Item(0);
    # Supprime les zones rognées de l'image du PictureFrame et renvoie l'image rognée
    $croppedImage = $picFrame->getPictureFormat()->deletePictureCroppedAreas();
    # Enregistre le résultat
    $presentation->save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($presentation)) {
      $presentation->dispose();
    }
  }

Verrouiller le rapport d’aspect

Si vous souhaitez qu’une forme contenant une image conserve son rapport d’aspect même après avoir modifié les dimensions de l’image, vous pouvez utiliser la méthode setAspectRatioLocked pour activer le paramètre Verrouiller le rapport d’aspect.

Ce code PHP montre comment verrouiller le rapport d’aspect d’une forme :

  $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);
    # définir la forme pour préserver le rapport d'aspect lors du redimensionnement
    $pictureFrame->getPictureFrameLock()->setAspectRatioLocked(true);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Utiliser la propriété StretchOff

En utilisant les propriétés StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight et StretchOffsetBottom de l’interface IPictureFillFormat et de la classe PictureFillFormat, vous pouvez spécifier un rectangle de remplissage.

Lorsque l’étirement est spécifié pour une image, un rectangle source est mis à l’échelle pour s’adapter au rectangle de remplissage spécifié. Chaque bord du rectangle de remplissage est défini par un décalage en pourcentage par rapport au bord correspondant de la boîte englobante de la forme. Un pourcentage positif indique un retrait tandis qu’un pourcentage négatif indique une extension.

  1. Créez une instance de la classe Presentation.
  2. Obtenez une référence à une diapositive via son indice.
  3. Ajoutez un rectangle AutoShape.
  4. Créez une image.
  5. Définissez le type de remplissage de la forme.
  6. Définissez le mode de remplissage d’image de la forme.
  7. Ajoutez une image définie pour remplir la forme.
  8. Spécifiez les décalages d’image par rapport au bord correspondant de la boîte englobante de la forme.
  9. Enregistrez la présentation modifiée sous forme de fichier PPTX.

Ce code PHP montre un processus où la propriété StretchOff est utilisée :

  # Instancie la classe Presentation qui représente un fichier PPTX
  $pres = new Presentation();
  try {
    # Récupère la première diapositive
    $slide = $pres->getSlides()->get_Item(0);
    # Instancie la classe ImageEx
    $picture;
    $image = Images->fromFile("aspose-logo.jpg");
    try {
      $picture = $pres->getImages()->addImage($image);
    } finally {
      if (!java_is_null($image)) {
        $image->dispose();
      }
    }
    # Ajoute un AutoShape de type Rectangle
    $aShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
    # Définit le type de remplissage de la forme
    $aShape->getFillFormat()->setFillType(FillType::Picture);
    # Définit le mode de remplissage image de la forme
    $aShape->getFillFormat()->getPictureFillFormat()->setPictureFillMode(PictureFillMode->Stretch);
    # Définit l'image pour remplir la forme
    $aShape->getFillFormat()->getPictureFillFormat()->getPicture()->setImage($picture);
    # Spécifie les décalages de l'image par rapport au bord correspondant de la boîte englobante de la forme
    $aShape->getFillFormat()->getPictureFillFormat()->setStretchOffsetLeft(25);
    $aShape->getFillFormat()->getPictureFillFormat()->setStretchOffsetRight(25);
    $aShape->getFillFormat()->getPictureFillFormat()->setStretchOffsetTop(-20);
    $aShape->getFillFormat()->getPictureFillFormat()->setStretchOffsetBottom(-10);
    # Enregistre le fichier PPTX sur le disque
    $pres->save("StretchOffsetLeftForPictureFrame_out.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

FAQ

Comment savoir quels formats d’image sont pris en charge pour PictureFrame ?

Aspose.Slides supporte à la fois les images matricielles (PNG, JPEG, BMP, GIF, etc.) et les images vectorielles (par exemple, SVG) via l’objet image assigné à un PictureFrame. La liste des formats pris en charge chevauche généralement les capacités du moteur de conversion de diapositives et d’images.

Comment l’ajout de dizaines d’images volumineuses affecte-t-il la taille et les performances du PPTX ?

L’intégration d’images volumineuses augmente la taille du fichier et la consommation de mémoire ; lier des images permet de réduire la taille de la présentation mais nécessite que les fichiers externes restent accessibles. Aspose.Slides offre la possibilité d’ajouter des images par lien pour réduire la taille du fichier.

Comment verrouiller un objet image contre un déplacement/redimensionnement accidentel ?

Utilisez les verrous de forme (shape locks) pour un PictureFrame (par exemple, désactiver le déplacement ou le redimensionnement). Le mécanisme de verrouillage est décrit pour les formes dans un article de protection séparé et est supporté pour divers types de formes, y compris les PictureFrame.

La fidélité du vecteur SVG est-elle conservée lors de l’exportation d’une présentation vers PDF/images ?

Aspose.Slides permet d’extraire un SVG d’un PictureFrame en tant que vecteur original. Lors de l'exportation vers PDF ou vers des formats matriciels, le résultat peut être rasterisé selon les paramètres d’exportation ; le fait que le SVG original soit stocké en tant que vecteur est confirmé par le comportement d’extraction.