Извлечение изображений из фигур презентации в Python
Извлечение изображений из фигур
Изображения часто добавляются к фигурам и также часто используются в качестве фона слайдов. Объекты изображений добавляются через IImageCollection, который представляет собой коллекцию объектов IPPImage.
В этой статье объясняется, как извлечь изображения, добавленные в презентации.
Чтобы извлечь изображение из презентации, необходимо сначала найти изображение, пройдя по каждому слайду, а затем по каждой фигуре. Как только изображение найдено или идентифицировано, его можно извлечь и сохранить как новый файл. 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 — это другой тип объекта.