Добавление кадров изображений в презентации с Python

Введение

Кадры изображений в Aspose.Slides for Python позволяют размещать и управлять растровыми и векторными изображениями как нативными объектами слайда. Вы можете вставлять изображения из файлов или потоков, позиционировать и изменять их размер с точными координатами, применять вращение, задавать прозрачность и управлять порядком наложения вместе с другими объектами. API также поддерживает кадрирование, сохранение соотношения сторон, установку рамок и эффектов, а также замену исходного изображения без пересборки макета. Поскольку кадры изображений ведут себя как обычные формы, вы можете добавлять анимацию, гиперссылки и альтернативный текст, что упрощает создание визуально насыщенных, доступных презентаций.

Создание кадров изображений

В этом разделе показано, как вставить изображение в слайд, создав PictureFrame с помощью Aspose.Slides for Python. Вы узнаете, как загрузить изображение, точно разместить его на слайде и управлять его размерами и форматированием.

  1. Создайте экземпляр класса Presentation.
  2. Получите слайд по его индексу.
  3. Создайте объект PPImage, добавив изображение в ImageCollection презентации. Это изображение будет использоваться для заполнения формы.
  4. Укажите ширину и высоту кадра.
  5. Создайте PictureFrame нужного размера с помощью метода add_picture_frame.
  6. Сохраните презентацию как файл PPTX.

Следующий код на Python демонстрирует создание кадра изображения:

import aspose.slides as slides

# Создайте экземпляр класса Presentation для представления файла PPTX.
with slides.Presentation() as presentation:
    # Получите первый слайд.
    slide = presentation.slides[0]

    # Добавьте изображение в презентацию.
    with open("image.jpeg", "rb") as image_stream:
        image = presentation.images.add_image(image_stream)

        # Добавьте кадр изображения размером с изображение.
        picture_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 50, 50, image.width, image.height, image)

        # Сохраните презентацию в формате PPTX.
        presentation.save("picture_frame.pptx", slides.export.SaveFormat.PPTX)

Создание кадров изображений с относительным масштабом

В этом разделе демонстрируется размещение изображения фиксированного размера, а затем применение масштабирования на основе процентов независимо для ширины и высоты. Поскольку проценты могут различаться, соотношение сторон может измениться. Масштабирование выполняется относительно оригинальных размеров изображения.

  1. Создайте экземпляр класса Presentation.
  2. Получите слайд по его индексу.
  3. Создайте объект PPImage, добавив изображение в ImageCollection презентации.
  4. Добавьте PictureFrame на слайд.
  5. Установите относительные ширину и высоту кадра изображения.
  6. Сохраните презентацию как файл PPTX.

Следующий код на Python демонстрирует создание кадра изображения с относительным масштабированием:

import aspose.slides as slides

# Создайте экземпляр класса Presentation для представления файла PPTX.
with slides.Presentation() as presentation:
    # Получите первый слайд.
    slide = presentation.slides[0]

    # Добавьте изображение в коллекцию изображений презентации.
    with open("image.jpeg", "rb") as image_stream:
        image = presentation.images.add_image(image_stream)

        # Добавьте кадр изображения на слайд.
        picture_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 50, 50, 100, 100, image)

        # Установите относительные масштабные значения ширины и высоты.
        picture_frame.relative_scale_height = 0.8
        picture_frame.relative_scale_width = 1.35

        # Сохраните презентацию.
        presentation.save("relative_scaling.pptx", slides.export.SaveFormat.PPTX)

Извлечение растровых изображений из кадров изображений

Вы можете извлекать растровые изображения из объектов PictureFrame и сохранять их в форматах PNG, JPG и других. Пример кода ниже показывает, как извлечь изображение из документа «sample.pptx» и сохранить его в формате PNG.

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    first_slide = presentation.slides[0]
    first_shape = first_slide.shapes[0]

    if isinstance(first_shape, slides.PictureFrame):
        image = first_shape.picture_format.picture.image.image
        image.save("slide_1_shape_1.png", slides.ImageFormat.PNG)

Извлечение SVG‑изображений из кадров изображений

Когда презентация содержит SVG‑графику, размещённую внутри фигур PictureFrame, Aspose.Slides for Python via .NET позволяет получить оригинальные векторные изображения с полной точностью. Путём обхода коллекции фигур слайда вы можете определить каждый PictureFrame, проверить, содержит ли соответствующий PPImage SVG‑контент, а затем сохранить это изображение на диск или в поток в его родном формате SVG.

Следующий пример кода демонстрирует извлечение SVG‑изображения из кадра:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]

    if isinstance(shape, slides.PictureFrame):
        svg_image = shape.picture_format.picture.image.svg_image

        if svg_image is not None:
            with open("output.svg", "w", encoding="utf-8") as svg_stream:
                svg_stream.write(svg_image.svg_content)

Получение прозрачности изображения

Aspose.Slides позволяет получать эффект прозрачности, применённый к изображению. Этот код на Python демонстрирует эту операцию:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    picture_frame = presentation.slides[0].shapes[0]
    image_transform = picture_frame.picture_format.picture.image_transform
    for effect in image_transform:
        if isinstance(effect, slides.effects.AlphaModulateFixed):
            transparency_value = 100 - effect.amount
            print("Picture transparency: " + str(transparency_value))

Получение яркости и контрастности изображения

Aspose.Slides позволяет получать эффекты яркости и контрастности, применённые к изображению. Класс Luminance представляет этот трансформирующий эффект изображения.

Этот код на Python демонстрирует, как получить настройки яркости и контрастности из кадра изображения:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]
    picture_frame = shape

    image_transform = picture_frame.picture_format.picture.image_transform
    for effect in image_transform:
        if isinstance(effect, slides.effects.Luminance):
            luminance = effect.get_effective()
            brightness = luminance.brightness
            contrast = luminance.contrast

            print("Brightness: " + str(brightness))
            print("Contrast: " + str(contrast))

Форматирование кадра изображения

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

  1. Создайте экземпляр класса Presentation.
  2. Получите слайд по его индексу.
  3. Создайте объект PPImage, добавив изображение в ImageCollection презентации. Это изображение будет использоваться для заполнения формы.
  4. Укажите ширину и высоту кадра.
  5. Создайте PictureFrame нужного размера с помощью метода add_picture_frame слайда.
  6. Задайте цвет линии кадра изображения.
  7. Задайте толщину линии кадра изображения.
  8. Поверните кадр, задав положительное (по часовой стрелке) или отрицательное (против часовой стрелки) значение.
  9. Сохраните изменённую презентацию как файл PPTX.

Следующий код на Python демонстрирует процесс форматирования кадра изображения:

import aspose.slides as slides
import aspose.pydrawing as draw

# Создайте экземпляр класса Presentation для представления файла PPTX.
with slides.Presentation() as presentation:
    # Получите первый слайд.
    slide = presentation.slides[0]

    # Добавьте изображение в коллекцию изображений презентации.
    with open("image.jpeg", "rb") as image_stream:
        image = presentation.images.add_image(image_stream)

        # Добавьте кадр изображения размером с изображение.
        picture_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 50, 50, image.width, image.height, image)

        # Примените форматирование к кадру изображения.
        picture_frame.line_format.fill_format.fill_type = slides.FillType.SOLID
        picture_frame.line_format.fill_format.solid_fill_color.color = draw.Color.blue
        picture_frame.line_format.width = 20
        picture_frame.rotation = 45

    # Сохраните презентацию в формате PPTX.
    presentation.save("picture_formatting.pptx", slides.export.SaveFormat.PPTX)

Добавление изображений как ссылок

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

import aspose.slides as slides

with slides.Presentation("input.pptx") as presentation:
    slide = presentation.slides[0]

    shapes_to_remove = []

    for shape in slide.shapes:
        if shape.placeholder is None:
            continue

        if shape.placeholder.type == slides.PlaceholderType.PICTURE:
            picture_frame = slide.shapes.add_picture_frame(
                slides.ShapeType.RECTANGLE, shape.x, shape.y, shape.width, shape.height, None)

            picture_frame.picture_format.picture.link_path_long = \
                "https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg"

            shapes_to_remove.append(shape)

        elif shape.placeholder.type == slides.PlaceholderType.MEDIA:
            video_frame = slide.shapes.add_video_frame(shape.X, shape.Y, shape.width, shape.height, "")

            video_frame.picture_format.picture.link_path_long = \
                "https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg"

            video_frame.link_path_long = "https://youtu.be/t_1LYZ102RA"
            shapes_to_remove.append(shape)

    for shape in shapes_to_remove:
        slide.shapes.remove(shape)

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Кадрирование изображений

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

Следующий код на Python показывает, как кадрировать изображение на слайде:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    # Добавьте изображение в коллекцию изображений презентации.
    with slides.Images.from_file("image.png") as source_image:
        image = presentation.images.add_image(source_image)

    # Добавьте кадр изображения на слайд.
    picture_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 100, 100, 420, 250, image)

    # Обрежьте изображение (значения в процентах).
    picture_frame.picture_format.crop_left = 23.6
    picture_frame.picture_format.crop_right = 21.5
    picture_frame.picture_format.crop_top = 3
    picture_frame.picture_format.crop_bottom = 31

    # Сохраните результат.
    presentation.save("cropped_image.pptx", slides.export.SaveFormat.PPTX)

Удаление обрезанных областей изображений

Если необходимо удалить обрезанные области изображения в кадре, используйте метод delete_picture_cropped_areas. Этот метод возвращает обрезанное изображение или оригинальное изображение, если обрезка не требовалась.

Следующий код на Python демонстрирует эту операцию:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]

    # Получить кадр изображения с первого слайда.
    picture_frame = slides.shape[0]

    # Получить кадр изображения с первого слайда.
    cropped_image = picture_frame.picture_format.delete_picture_cropped_areas()

    # Сохранить результат.
    presentation.save("deleted_cropped_areas.pptx", slides.export.SaveFormat.PPTX)

Сжатие изображений

Вы можете сжимать изображение в презентации, используя метод PictureFillFormat.compress_image. Этот метод уменьшает размер изображения, исходя из размеров формы и указанного разрешения, с опцией удаления обрезанных областей.

Он изменяет размер и разрешение изображения аналогично функции PowerPoint Формат рисунка → Сжать изображения → Разрешение.

Следующие примеры на Python демонстрируют, как сжать изображение в презентации, указав целевое разрешение и, при желании, удалив обрезанные области:

import aspose.slides as slides

with slides.Presentation("demo.pptx") as presentation:
    slide = presentation.slides[0]
    picture_frame = slide.shapes[0]

    # Сжать изображение с целевым разрешением 150 DPI (разрешение для web) и удалить обрезанные области.
    result = picture_frame.picture_format.compress_image(True, slides.export.PicturesCompression.DPI150)

    # Проверить результат сжатия.
    if result:
        print("Image successfully compressed.")
    else:
        print("Image compression failed or no changes were necessary.")

    presentation.save("compressed_image.pptx", slides.export.SaveFormat.PPTX)

Или указав пользовательское значение DPI напрямую:

import aspose.slides as slides

with slides.Presentation("demo.pptx") as presentation:
    slide = presentation.slides[0]
    picture_frame = slide.shapes[0]

    # Сжать изображение до 150 DPI (разрешение для web), удаляя обрезанные области.
    picture_frame.picture_format.compress_image(True, 150)

    presentation.save("compressed_image.pptx", slides.export.SaveFormat.PPTX)

Блокировка соотношения сторон

Если вы хотите, чтобы форма, содержащая изображение, сохраняла своё соотношение сторон после изменения размеров изображения, установите свойство aspect_ratio_locked в значение True.

Следующий код на Python показывает, как заблокировать соотношение сторон формы:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    layout = presentation.layout_slides.get_by_type(slides.SlideLayoutType.CUSTOM)
    empty_slide = presentation.slides.add_empty_slide(layout)

    with slides.Images.from_file("image.png") as source_image:
        image = presentation.images.add_image(source_image)

    picture_frame = empty_slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 50, 50, image.width, image.height, image)

    # Заблокировать соотношение сторон при изменении размеров.
    picture_frame.picture_frame_lock.aspect_ratio_locked = True

    presentation.save("aspect_ratio_locked.pptx", slides.export.SaveFormat.PPTX)

Использование свойств смещения растяжения

С помощью свойств stretch_offset_left, stretch_offset_top, stretch_offset_right и stretch_offset_bottom класса PictureFillFormat вы можете задать прямоугольник заполнения.

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

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на слайд по его индексу.
  3. Добавьте прямоугольный AutoShape.
  4. Установите тип заливки формы.
  5. Установите режим заливки изображения формы.
  6. Загрузите изображение.
  7. Присвойте изображение в качестве заливки формы.
  8. Укажите смещения изображения от соответствующих граней ограничивающего прямоугольника формы.
  9. Сохраните презентацию как файл PPTX.

Следующий код на Python демонстрирует использование свойств смещения растяжения:

import aspose.slides as slides

# Создайте экземпляр класса Presentation, представляющего файл PPTX.
with slides.Presentation() as presentation:
    # Получите первый слайд.
    slide = presentation.slides[0]

    # Добавьте прямоугольную AutoShape.
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 20, 20, 300, 300)

    # Установите тип заливки формы.
    shape.fill_format.fill_type = slides.FillType.PICTURE

    # Установите режим заливки изображения формы.
    shape.fill_format.picture_fill_format.picture_fill_mode = slides.PictureFillMode.STRETCH

    # Загрузите изображение и добавьте его в презентацию.
    with open("image.jpeg", "rb") as image_stream:
        image = presentation.images.add_image(image_stream)

    # Присвойте изображение для заполнения формы.
    shape.fill_format.picture_fill_format.picture.image = image

    # Укажите смещения изображения от соответствующих краёв ограничивающего прямоугольника формы.
    shape.fill_format.picture_fill_format.stretch_offset_left = 25
    shape.fill_format.picture_fill_format.stretch_offset_right = 25
    shape.fill_format.picture_fill_format.stretch_offset_top = -20
    shape.fill_format.picture_fill_format.stretch_offset_bottom = -10

    # Сохраните файл PPTX на диск.
    presentation.save("stretch_offset.pptx", slides.export.SaveFormat.PPTX)

FAQ

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

Aspose.Slides поддерживает как растровые изображения (PNG, JPEG, BMP, GIF и т.д.), так и векторные (например, SVG) через объект изображения, присваиваемый PictureFrame. Список поддерживаемых форматов в целом совпадает с возможностями движка преобразования слайдов и изображений.

Как добавление десятков больших изображений отразится на размере и производительности PPTX?

Встраивание больших изображений увеличивает размер файла и потребление памяти; связывание изображений помогает уменьшить размер презентации, но требует постоянного доступа к внешним файлам. Aspose.Slides предоставляет возможность добавлять изображения по ссылке для снижения размера файла.

Как заблокировать объект изображения от случайного перемещения/изменения размера?

Используйте shape locks для PictureFrame (например, отключите перемещение или изменение размера). Механизм блокировки описан для фигур в отдельной статье о защите и поддерживается различными типами фигур, включая PictureFrame.

Сохраняется ли векторная точность SVG при экспорте презентации в PDF/изображения?

Aspose.Slides позволяет извлекать SVG из PictureFrame как оригинальный вектор. При экспорте в PDF или растровые форматы результат может быть растровым в зависимости от настроек экспорта; факт того, что оригинальный SVG хранится как вектор, подтверждается поведением функции извлечения.