Extraer imágenes de formas de presentación en Python

Extraer imágenes de formas

Para extraer una imagen de una presentación, debe localizar la imagen primero recorriendo cada diapositiva y luego cada forma. Una vez que la imagen se encuentre o identifique, puede extraerla y guardarla como un nuevo archivo. 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:
    #Accediendo a la presentación
    
    slideIndex = 0
    image_type = ""
    ifImageFound = False
    for slide in pres.slides:
        slideIndex += 1
        #Accediendo a la primera diapositiva
        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:
            #Obteniendo la imagen de fondo  
            back_image = slide.background.fill_format.picture_fill_format.picture.image
        elif slide.layout_slide.background.fill_format.fill_type == slides.FillType.PICTURE:
            #Obteniendo la imagen de fondo  
            back_image = slide.layout_slide.background.fill_format.picture_fill_format.picture.image
            is_layout = True

        if back_image is not None:
            #Estableciendo el formato de imagen deseado 
            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)

Preguntas frecuentes

¿Puedo extraer la imagen original sin recortes, efectos o transformaciones de la forma?

Sí. Cuando accede a la imagen de una forma, obtiene el objeto de imagen de la image collection de la presentación, lo que significa los píxeles originales sin recortes ni efectos de estilo. El flujo de trabajo recorre la colección de imágenes de la presentación y los objetos PPImage, que almacenan los datos sin procesar.

¿Existe el riesgo de duplicar archivos idénticos al guardar muchas imágenes a la vez?

Sí, si guarda todo indiscriminadamente. La image collection de una presentación puede contener datos binarios idénticos referenciados por diferentes formas o diapositivas. Para evitar duplicados, compare los hash, tamaños o contenidos de los datos extraídos antes de escribir.

¿Cómo puedo determinar qué formas están vinculadas a una imagen específica de la colección de la presentación?

Aspose.Slides no almacena enlaces inversos de PPImage a las formas. Construya un mapeo manualmente durante la recorrido: cada vez que encuentre una referencia a un PPImage, registre qué formas lo utilizan.

¿Puedo extraer imágenes incrustadas dentro de objetos OLE, como documentos adjuntos?

No directamente, porque un objeto OLE es un contenedor. Necesita extraer el paquete OLE y luego analizar su contenido usando herramientas separadas. Las formas de imagen de la presentación funcionan a través de PPImage; OLE es un tipo de objeto diferente.