Извлечение изображений из фигур презентации

Извлечение изображений из фигур

Чтобы извлечь изображение из презентации, сначала необходимо найти изображение, проходя каждый слайд, а затем каждую фигуру. После того как изображение найдено или определено, его можно извлечь и сохранить как новый файл.

    public void extractImages()
    {
        Presentation pres = new Presentation(folderPath + "ExtractImages.pptx");
        com.aspose.slides.IPPImage img = null;
        com.aspose.slides.IPPImage backImage = null;

        int slideIndex = 0;
        String imageType = "";
        boolean ifImageFound = false;
        for (int i = 0; i < pres.getSlides().size(); i++)
        {

            slideIndex++;
            //Получает первый слайд
            ISlide sl = pres.getSlides().get_Item(i);


            //Получает первый слайд Slide sl = pres.getSlideByPosition(i);
            if (sl.getBackground().getFillFormat().getFillType() == FillType.Picture)
            {
                //Получает фоновое изображение
                backImage = sl.getBackground().getFillFormat().getPictureFillFormat().getPicture().getImage();
                imageType = getImageTType(backImage);

                String imagePath = folderPath + "backImage_" + "Slide_" + slideIndex + "." + imageType;
                //Сохраняет изображение
                backImage.getImage().save(imagePath, (int) ImageFormat.getValue(ImageFormat.class, capitalize(imageType)));
            } else
            {
                if (sl.getLayoutSlide().getBackground().getFillFormat().getFillType() == FillType.Picture)
                {
                    //Получает фоновое изображение
                    backImage = sl.getLayoutSlide().getBackground().getFillFormat().getPictureFillFormat().getPicture().getImage();
                    imageType = getImageTType(backImage);

                    String imagePath = folderPath + "backImage_" + "LayoutSlide_" + slideIndex + "." + imageType;
                    //Сохраняет изображение
                    backImage.getImage().save(imagePath, (int) ImageFormat.getValue(ImageFormat.class, capitalize(imageType)));
                }
            }

            for (int j = 0; j < sl.getShapes().size(); j++)
            {
                // Получает форму, содержащую изображение
                IShape sh = sl.getShapes().get_Item(j);

                if (sh instanceof IAutoShape)
                {
                    IAutoShape ashp = (IAutoShape) sh;
                    if (ashp.getFillFormat().getFillType() == FillType.Picture)
                    {
                        img = ashp.getFillFormat().getPictureFillFormat().getPicture().getImage();
                        imageType = getImageTType(img);
                        ifImageFound = true;
                    }
                } else if (sh instanceof IPictureFrame)
                {
                    IPictureFrame pf = (IPictureFrame) sh;
                    img = pf.getPictureFormat().getPicture().getImage();
                    imageType = getImageTType(img);
                    ifImageFound = true;
                }

                //Устанавливает предпочтительный формат изображения
                if (ifImageFound)
                {
                    String imagePath = folderPath + "backImage_" + "Slide_" + slideIndex + "_Shape_" + j + "." + imageType;
                    //Сохраняет изображение
                    img.getImage().save(imagePath, (int) ImageFormat.getValue(ImageFormat.class, capitalize(imageType)));
                }
                ifImageFound = false;
            }
        }
    }

    private String getImageTType(IPPImage image)
    {
        String imageContentType = image.getContentType();
        imageContentType = imageContentType.substring(imageContentType.indexOf("/") + 1);
        imageContentType = imageContentType.substring(imageContentType.indexOf("-") + 1);
        return imageContentType;
    }

    private String capitalize(String str)
    {
        if (str == null || str.length() <= 1) return str;
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

Часто задаваемые вопросы

Могу ли я извлечь оригинальное изображение без обрезки, эффектов или трансформаций фигуры?

Да. При доступе к изображению фигуры вы получаете объект изображения из коллекции изображений, что означает оригинальные пиксели без обрезки или стилистических эффектов. Рабочий процесс проходит через коллекцию изображений презентации и объекты PPImage , которые хранят необработанные данные.

Есть ли риск дублирования одинаковых файлов при одновременном сохранении большого количества изображений?

Да, если сохранять всё без разбора. Коллекция изображений презентации может содержать одинаковые бинарные данные, на которые ссылаются разные фигуры или слайды. Чтобы избежать дублирования, сравнивайте хэши, размеры или содержимое извлечённых данных перед записью.

Как определить, какие фигуры связаны с конкретным изображением из коллекции презентации?

Aspose.Slides не хранит обратные ссылки от PPImage к фигурам. Постройте отображение вручную во время обхода: каждый раз, когда находите ссылку на PPImage, фиксируйте, какие фигуры её используют.

Могу ли я извлечь изображения, встроенные в OLE‑объекты, такие как вложенные документы?

Не напрямую, поскольку OLE‑объект является контейнером. Необходимо извлечь сам OLE‑пакет, а затем проанализировать его содержимое с помощью отдельных инструментов. Фигуры‑картинки в презентации работают через PPImage; OLE — это другой тип объекта.