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

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. De cette façon, vous pouvez mettre en forme l’image en formatant le cadre d’image.

Créer un cadre d’image

  1. Créer une instance de la classe Presentation.
  2. Obtenir une référence à une diapositive par son index.
  3. Créer un objet IPPImage en ajoutant une image à la IImagescollection associée à l’objet présentation qui sera utilisé pour remplir la forme.
  4. Spécifier la largeur et la hauteur de l’image.
  5. Créer un PictureFrame en fonction de la largeur et de la hauteur de l’image via la méthode AddPictureFrame exposée par l’objet forme associé à la diapositive référencée.
  6. Ajouter un cadre d’image (contenant l’image) à la diapositive.
  7. Enregistrer la présentation modifiée en tant que fichier PPTX.

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

// Instancie la classe Presentation qui représente un fichier PPTX
Presentation pres = new Presentation();
try {
    // Obtient la première diapositive
    ISlide sld = pres.getSlides().get_Item(0);
    
    // Instancie la classe Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new 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 (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

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

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

  1. Créer une instance de la classe Presentation.
  2. Obtenir une référence à une diapositive par son index.
  3. Ajouter une image à la collection d’images de la présentation.
  4. Créer un objet IPPImage en ajoutant une image à la IImagescollection associée à l’objet présentation qui sera utilisé pour remplir la forme.
  5. Spécifier la largeur et la hauteur relatives de l’image dans le cadre d’image.
  6. Enregistrer la présentation modifiée en tant que fichier PPTX.

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

// Instancie la classe Presentation qui représente le PPTX
Presentation pres = new Presentation();
try {
    // Obtient la première diapositive
    ISlide sld = pres.getSlides().get_Item(0);
    
    // Instancie la classe Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
    
    
    // Ajoute un cadre d'image avec la même hauteur et largeur que l'image
    IPictureFrame pf = sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    
    // Définit l'échelle relative en largeur et hauteur
    pf.setRelativeScaleHeight(0.8f);
    pf.setRelativeScaleWidth(1.35f);
    
    // Enregistre le fichier PPTX sur le disque
    pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Extraire des images raster depuis les cadres d’image

Vous pouvez extraire des images raster depuis les 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 presentation = new Presentation("sample.pptx");

try {
    ISlide firstSlide = presentation.getSlides().get_Item(0);
    IShape firstShape = firstSlide.getShapes().get_Item(0);

    if (firstShape instanceof IPictureFrame) {
        IPictureFrame pictureFrame = (IPictureFrame) firstShape;
        try {
			IImage slideImage = pictureFrame.getPictureFormat().getPicture().getImage().getImage();
			slideImage.save("slide_1_shape_1.png", ImageFormat.Png);
		} finally {
			if (slideImage != null) slideImage.dispose();
		}
    }
} catch (IOException e) {
} finally {
    presentation.dispose();
}

Extraire des images SVG depuis les cadres d’image

Lorsque une présentation contient des graphiques SVG placés à l’intérieur de formes PictureFrame, Aspose.Slides for 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 l'IPPImage sous-jacent contient du contenu SVG, puis enregistrer cette image sur le disque ou dans un flux dans son format SVG natif.

Le code suivant montre comment extraire une image SVG d’un cadre d’image :

Presentation presentation = new Presentation("sample.pptx");

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

    if (shape instanceof IPictureFrame) {
        IPictureFrame pictureFrame = (IPictureFrame) shape;
        ISvgImage svgImage = pictureFrame.getPictureFormat().getPicture().getImage().getSvgImage();

        FileOutputStream fos = new FileOutputStream("output.svg");
        fos.write(svgImage.getSvgData());
        fos.close();
    }
} catch (IOException e) {
    System.out.println(e.getMessage());
} finally {
    presentation.dispose();
}

Obtenir la transparence d’une image

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

Presentation presentation = new Presentation("Test.pptx");

var pictureFrame = (IPictureFrame) presentation.getSlides().get_Item(0).getShapes().get_Item(0);
var imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
for (var effect : imageTransform) {
    if (effect instanceof IAlphaModulateFixed) {
        var alphaModulateFixed = (IAlphaModulateFixed) effect;
        var transparencyValue = 100 - alphaModulateFixed.getAmount();
        System.out.println("Picture transparency: " + transparencyValue);
    }
}

Mise en forme du cadre d’image

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

  1. Créer une instance de la classe Presentation.
  2. Obtenir une référence à une diapositive par son index.
  3. Créer un objet IPPImage en ajoutant une image à la IImagescollection associée à l’objet présentation qui sera utilisé pour remplir la forme.
  4. Spécifier la largeur et la hauteur de l’image.
  5. Créer un PictureFrame en fonction de la largeur et de la hauteur de l’image via la méthode AddPictureFrame exposée par l’objet IShapes associé à la diapositive référencée.
  6. Ajouter le cadre d’image (contenant l’image) à la diapositive.
  7. Définir la couleur du bord du cadre d’image.
  8. Définir l’épaisseur du bord du cadre d’image.
  9. Faire 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. Ajouter le cadre d’image (contenant l’image) à la diapositive.
  11. Enregistrer la présentation modifiée en tant que fichier PPTX.

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

// Instancie la classe Presentation qui représente le PPTX
Presentation pres = new Presentation();
try {
    // Obtient la première diapositive
    ISlide sld = pres.getSlides().get_Item(0);
    
    // Instancie la classe Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
    
    // Ajoute un cadre d'image avec la même hauteur et largeur que l'image
    IPictureFrame pf = sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    
    // Applique un formatage à PictureFrameEx
    pf.getLineFormat().getFillFormat().setFillType(FillType.Solid);
    pf.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLUE);
    pf.getLineFormat().setWidth(20);
    pf.setRotation(45);
    
    // Enregistre le fichier PPTX sur le disque
    pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Ajouter une image sous forme de lien

Pour éviter d’augmenter la taille des présentations, vous pouvez ajouter des images (ou vidéos) via des liens plutôt que d’intégrer les fichiers directement dans les présentations. Ce code Java montre comment ajouter une image et une vidéo dans un espace réservé :

Presentation presentation = new Presentation("input.pptx");
try {
    ArrayList<IShape> shapesToRemove = new ArrayList<IShape>();
    int shapesCount = presentation.getSlides().get_Item(0).getShapes().size();

    for (int i = 0; i < shapesCount; i++)
    {
        IShape autoShape = presentation.getSlides().get_Item(0).getShapes().get_Item(i);

        if (autoShape.getPlaceholder() == null)
        {
            continue;
        }

        switch (autoShape.getPlaceholder().getType())
        {
            case PlaceholderType.Picture:
                IPictureFrame 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:
                IVideoFrame 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 (IShape shape : shapesToRemove)
    {
        presentation.getSlides().get_Item(0).getShapes().remove(shape);
    }

    presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
    if (presentation != null) presentation.dispose();
}

Rogner des images

Ce code Java montre comment rogner une image existante sur une diapositive :

Presentation pres = new Presentation();
// Crée un nouvel objet image
try {
    IPPImage picture;
    IImage image = Images.fromFile(imagePath);
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }

    // Ajoute un PictureFrame à une diapositive
    IPictureFrame picFrame = pres.getSlides().get_Item(0).getShapes().addPictureFrame(
            ShapeType.Rectangle, 100, 100, 420, 250, picture);

    // Rogne l'image (valeurs en pourcentage)
    picFrame.getPictureFormat().setCropLeft(23.6f);
    picFrame.getPictureFormat().setCropRight(21.5f);
    picFrame.getPictureFormat().setCropTop(3);
    picFrame.getPictureFormat().setCropBottom(31);

    // Enregistre le résultat
    pres.save(outPptxFile, SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Supprimer les zones rognées d’un cadre d’image

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 Java montre l’opération :

Presentation presentation = new Presentation("PictureFrameCrop.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    // Obtient le PictureFrame de la première diapositive
    IPictureFrame picFrame = (IPictureFrame)slide.getShapes().get_Item(0);

    // Supprime les zones rognées de l'image du PictureFrame et renvoie l'image rognée
    IPPImage croppedImage = picFrame.getPictureFormat().deletePictureCroppedAreas();

    // Enregistre le résultat
    presentation.save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
} finally {
    if (presentation != null) presentation.dispose();
}

Verrouiller le ratio d’aspect

Si vous souhaitez qu’une forme contenant une image conserve son ratio d’aspect même après modification des dimensions de l’image, vous pouvez utiliser la méthode setAspectRatioLocked pour activer le paramètre Lock Aspect Ratio.

Ce code Java montre comment verrouiller le ratio d’aspect d’une forme :

Presentation pres = new Presentation("pres.pptx");
try {
    ILayoutSlide layout = pres.getLayoutSlides().getByType(SlideLayoutType.Custom);
    ISlide emptySlide = pres.getSlides().addEmptySlide(layout);
    IPPImage picture;
    IImage image = Images.fromFile("image.png");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }
    IPictureFrame pictureFrame = emptySlide.getShapes().addPictureFrame(
            ShapeType.Rectangle, 50, 150, presImage.getWidth(), presImage.getHeight(), picture);

    // définir la forme afin de conserver le ratio d'aspect lors du redimensionnement
    pictureFrame.getPictureFrameLock().setAspectRatioLocked(true);
} catch(IOException e) {
} finally {
    if (pres != null) 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, le 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 offset 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 un débordement.

  1. Créer une instance de la classe Presentation.
  2. Obtenir une référence à une diapositive par son index.
  3. Ajouter un rectangle AutoShape.
  4. Créer une image.
  5. Définir le type de remplissage de la forme.
  6. Définir le mode de remplissage image de la forme.
  7. Ajouter une image définie pour remplir la forme.
  8. Spécifier les décalages de l’image depuis le bord correspondant de la boîte englobante de la forme
  9. Enregistrer la présentation modifiée en tant que fichier PPTX.

Ce code Java montre un processus utilisant la propriété StretchOff :

// Instancie la classe Presentation qui représente un fichier PPTX
Presentation pres = new Presentation();
try {
    // Obtient la première diapositive
    ISlide slide = pres.getSlides().get_Item(0);

    // Instancie la classe ImageEx
    IPPImage picture;
    IImage image = Images.fromFile("aspose-logo.jpg");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }

    // Ajoute une AutoShape de type Rectangle
    IAutoShape 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 aux bords correspondants 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 (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

FAQ

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

Aspose.Slides prend en charge les images raster (PNG, JPEG, BMP, GIF, etc.) ainsi que les images vectorielles (par exemple, SVG) via l’objet image attribué à un PictureFrame. La liste des formats pris en charge se recoupe généralement avec 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’incorporation d’images volumineuses augmente la taille du fichier et la consommation mémoire ; lier les 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 afin de réduire la taille du fichier.

Comment verrouiller un objet image pour éviter les déplacements/redimensionnements accidentels ?

Utilisez les verrous de forme 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 pris en charge pour divers types de formes, y compris PictureFrame.

Le rendu vectoriel SVG est-il conservé lors de l’exportation d’une présentation vers PDF/images ?

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