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

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

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

import aspose.slides as slides

def get_image_format(image_type):
    return {
        "jpeg": slides.ImageFormat.JPEG,
        "emf": slides.ImageFormat.EMF,
        "bmp": slides.ImageFormat.BMP,
        "png": slides.ImageFormat.PNG,
        "wmf": slides.ImageFormat.WMF,
        "gif": slides.ImageFormat.GIF,
    }.get(image_type, slides.ImageFormat.JPEG)

with slides.Presentation("pres.pptx") as pres:
    #Получение доступа к презентации
    
    slideIndex = 0
    image_type = ""
    ifImageFound = False
    for slide in pres.slides:
        slideIndex += 1
        #Получение доступа к первому слайду
        image_format = slides.ImageFormat.JPEG

        back_image = None
        file_name = "BackImage_Slide_{0}{1}.{2}"
        is_layout = False

        if slide.background.fill_format.fill_type == slides.FillType.PICTURE:
            #Получение фонового изображения  
            back_image = slide.background.fill_format.picture_fill_format.picture.image
        elif slide.layout_slide.background.fill_format.fill_type == slides.FillType.PICTURE:
            #Получение фонового изображения  
            back_image = slide.layout_slide.background.fill_format.picture_fill_format.picture.image
            is_layout = True

        if back_image is not None:
            #Установка требуемого формата изображения 
            image_type = back_image.content_type.split("/")[1]
            image_format = get_image_format(image_type)

            back_image.image.save(
                file_name.format("LayoutSlide_" if is_layout else "", slideIndex, image_type), 
                image_format)

        for i in range(len(slide.shapes)):
            shape = slide.shapes[i]
            shape_image = None

            if type(shape) is slides.AutoShape and shape.fill_format.fill_type == slides.FillType.PICTURE:
                shape_image = shape.fill_format.picture_fill_format.picture.image
            elif type(shape) is slides.PictureFrame:
                shape_image = shape.picture_format.picture.image

            if shape_image is not None:
                image_type = shape_image.content_type.split("/")[1]
                image_format = get_image_format(image_type)

                shape_image.image.save(
                                file_name.format("shape_"+str(i)+"_", slideIndex, image_type), 
                                image_format)

FAQ

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

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

Существует ли риск дублирования одинаковых файлов при одновременном сохранении множества изображений?

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

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

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

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

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