Преобразование слайдов презентаций в изображения на C++

Введение

Aspose.Slides for C++ может рендерить отдельные слайды из презентаций PowerPoint и OpenDocument в форматах PNG, JPEG, GIF, TIFF и других форматов изображений.

Чтобы преобразовать слайд в изображение, выполните следующие шаги:

  1. Загрузите презентацию с помощью класса Presentation.
  2. Выберите слайд, который нужно отрендерить.
  3. При необходимости настройте рендеринг с помощью класса RenderingOptions или TiffOptions.
  4. Вызовите метод ISlide::GetImage. Он возвращает объект IImage.
  5. Вызовите метод IImage::Save и укажите формат вывода с помощью значения ImageFormat.

Преобразование слайда в PNG-изображение

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

В следующем примере C++ первый слайд рендерится и сохраняется как PNG-изображение:

#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <IImage.h>
#include <ImageFormat.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace System;

auto presentation = MakeObject<Presentation>(u"Presentation.pptx");
auto slide = presentation->get_Slide(0);

auto image = slide->GetImage();
image->Save(u"Slide_0.png", ImageFormat::Png);

image->Dispose();
presentation->Dispose();

Преобразование слайдов в изображения с пользовательскими размерами

Используйте перегрузку ISlide::GetImage, которая принимает значение Size, чтобы отрендерить слайд с точными пиксельными размерами.

В следующем примере создаётся JPEG‑изображение размером 1820 × 1040:

#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <IImage.h>
#include <ImageFormat.h>
#include <drawing/size.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace System;
using namespace System::Drawing;

Size imageSize(1820, 1040);

auto presentation = MakeObject<Presentation>(u"Presentation.pptx");
auto slide = presentation->get_Slide(0);

auto image = slide->GetImage(imageSize);
image->Save(u"Slide_0.jpg", ImageFormat::Jpeg);

image->Dispose();
presentation->Dispose();

Преобразование слайдов с заметками и комментариями в изображения

По умолчанию изображения слайдов не включают заметки или комментарии. Присвойте объект NotesCommentsLayoutingOptions методу RenderingOptions::set_SlidesLayoutOptions, чтобы управлять размещением заметок и комментариев.

В следующем примере усечённые заметки размещаются под слайдом, а комментарии — справа от него:

#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/CommentsPositions.h>
#include <Export/NotesCommentsLayoutingOptions.h>
#include <Export/NotesPositions.h>
#include <Export/RenderingOptions.h>
#include <IImage.h>
#include <ImageFormat.h>
#include <drawing/color.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

float scaleX = 2.0f;
float scaleY = scaleX;

auto layoutOptions = MakeObject<NotesCommentsLayoutingOptions>();
layoutOptions->set_NotesPosition(NotesPositions::BottomTruncated);
layoutOptions->set_CommentsPosition(CommentsPositions::Right);
layoutOptions->set_CommentsAreaWidth(500);
layoutOptions->set_CommentsAreaColor(Color::get_AntiqueWhite());

auto renderingOptions = MakeObject<RenderingOptions>();
renderingOptions->set_SlidesLayoutOptions(layoutOptions);

auto presentation = MakeObject<Presentation>(u"Presentation_with_notes_and_comments.pptx");
auto slide = presentation->get_Slide(0);

auto image = slide->GetImage(renderingOptions, scaleX, scaleY);
image->Save(u"Image_with_notes_and_comments_0.gif", ImageFormat::Gif);

image->Dispose();
presentation->Dispose();

Преобразование слайдов в изображения с использованием TIFF‑опций

Класс TiffOptions позволяет управлять размером, разрешением и другими свойствами отрендеренного TIFF‑изображения.

В следующем примере первый слайд рендерится как TIFF‑изображение размером 2160 × 2880 с разрешением 300 DPI:

#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/TiffOptions.h>
#include <IImage.h>
#include <ImageFormat.h>
#include <drawing/size.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

auto tiffOptions = MakeObject<TiffOptions>();
tiffOptions->set_ImageSize(Size(2160, 2880));
tiffOptions->set_DpiX(300);
tiffOptions->set_DpiY(300);

auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);

auto image = slide->GetImage(tiffOptions);
image->Save(u"output.tiff", ImageFormat::Tiff);

image->Dispose();
presentation->Dispose();

Преобразование всех слайдов в изображения

Итерируйте коллекцию слайдов, чтобы преобразовать всю презентацию в последовательность изображений. Скрытые слайды включаются, если вы явно не пропустите их.

В следующем примере каждый слайд рендерится как JPEG‑изображение с горизонтальными и вертикальными коэффициентами масштабирования, равными 2:

#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <IImage.h>
#include <ImageFormat.h>
#include <system/smart_ptr.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace System;

float scaleX = 2.0f;
float scaleY = scaleX;

auto presentation = MakeObject<Presentation>(u"Presentation.pptx");

int32_t slideCount = presentation->get_Slides()->get_Count();
for (int32_t index = 0; index < slideCount; index++)
{
    auto slide = presentation->get_Slide(index);
    auto image = slide->GetImage(scaleX, scaleY);
    image->Save(String::Format(u"Slide_{0}.jpg", index), ImageFormat::Jpeg);
    image->Dispose();
}

presentation->Dispose();

Создание вывода в формате Enhanced Metafile

Enhanced Metafile (EMF) полезен, когда необходимо обмениваться векторной графикой с Microsoft Office или другими Windows‑приложениями, поддерживающими Windows‑метафайлы. В отличие от растрового изображения, EMF может сохранять векторные операции рисования, которые масштабируются без потери чёткости. Однако EMF в основном является форматом совместимости для приложений с поддержкой Windows‑метафайлов, а не универсальным форматом обмена. Кроме того, сложное содержимое слайда, такое как растровые изображения и некоторые эффекты, может храниться в виде растровых элементов внутри контейнера векторного метафайла.

Экспорт слайда в EMF

Метод ISlide::WriteAsEmf записывает объект ISlide в целевой поток в формате EMF. В следующем примере загружается презентация, выбирается первый слайд и записывается в поток EMF‑файла:

#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/io/file.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace System;
using namespace System::IO;

auto presentation = MakeObject<Presentation>(u"Presentation.pptx");
auto slide = presentation->get_Slide(0);

auto emfStream = File::Create(u"Slide_0.emf");
slide->WriteAsEmf(emfStream);

emfStream->Close();
presentation->Dispose();

Вызывающая сторона владеет потоком, переданным в ISlide::WriteAsEmf, и должна закрыть или освободить его. Aspose.Slides пишет в текущую позицию потока и оставляет его открытым.

Преобразование SVG‑изображения в EMF и добавление его в презентацию

Используйте ISvgImage::WriteAsEmf для преобразования SVG‑контента в EMF. Полученные байты можно добавить в презентацию через IImageCollection::AddImage и разместить на слайде с помощью IShapeCollection::AddPictureFrame.

В следующем примере создаётся объект SvgImage из SVG‑разметки, преобразуется в EMF в памяти, вставляется в первый слайд и сохраняется презентация:

#include <DOM/IImageCollection.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <DOM/SvgImage.h>
#include <Export/SaveFormat.h>
#include <system/io/memory_stream.h>
#include <system/smart_ptr.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::IO;

String svgContent = u"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"100\"><rect width=\"200\" height=\"100\" fill=\"#4472C4\"/></svg>";
auto svgImage = MakeObject<SvgImage>(svgContent);

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto emfStream = MakeObject<MemoryStream>();
svgImage->WriteAsEmf(emfStream);

auto emfData = emfStream->ToArray();
auto image = presentation->get_Images()->AddImage(emfData);
slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 20, 20, 200, 100, image);

presentation->Save(u"Presentation_with_emf.pptx", SaveFormat::Pptx);

emfStream->Close();
presentation->Dispose();

ISvgImage::WriteAsEmf не принимает владение над целевым потоком. После записи позиция потока находится в конце сгенерированных данных. В примере вызывается MemoryStream::ToArray для получения полного буфера независимо от текущей позиции потока, затем этот массив байтов передаётся в IImageCollection::AddImage. Оставляйте поток открытым, пока потребитель не завершит чтение, и закрывайте его после этого.

Генерация EMF доступна на операционных системах, поддерживаемых Aspose.Slides для C++, но рендеринг может различаться между платформами при отсутствии шрифтов или нативных графических зависимостей. Установите шрифты, используемые исходным содержимым, или настройте соответствующие замены, следуйте требованиям к платформе для Aspose.Slides для C++ и проверьте результат в целевом приложении, потребляющем EMF. Приложения для Linux и macOS часто имеют ограниченную или непоследовательную поддержку отображения и редактирования Windows‑метафайлов.

Отображение цветных эмодзи

FAQ

Поддерживает ли Aspose.Slides рендеринг слайдов с анимациями?

Нет. Метод ISlide::GetImage рендерит статическое изображение слайда и не экспортирует анимации.

Можно ли экспортировать скрытые слайды как изображения?

Да. Скрытые слайды можно рендерить так же, как обычные. Включайте их в цикл обработки, как показано в примере выше.

Сохраняются ли тени и другие эффекты на изображениях слайдов?

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