Управление рамками изображений в презентациях на .NET

Введение

Рамка изображения — это фигура, содержащая изображение, похожая на картину в раме.

Вы можете добавить изображение на слайд через раму изображения. Таким образом, вы форматируете изображение, форматируя раму.

Создание рамки изображения

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на слайд по его индексу.
  3. Создайте объект IPPImage, добавив изображение в IImagescollection, связанную с объектом презентации, которое будет использовано для заполнения фигуры.
  4. Укажите ширину и высоту изображения.
  5. Создайте PictureFrame на основе ширины и высоты изображения через метод AddPictureFrame, предоставленный объектом shape, связанным с выбранным слайдом.
  6. Добавьте рамку изображения (содержащую картинку) на слайд.
  7. Сохраните изменённую презентацию в файл PPTX.
 // Создает экземпляр класса Presentation, представляющего файл PPTX
 using (Presentation pres = new Presentation())
 {
     // Получает первый слайд
     ISlide slide = pres.Slides[0];

     // Загружает изображение и добавляет его в коллекцию изображений презентации
     IImage image = Images.FromFile("aspose-logo.jpg");
     IPPImage ppImage = pres.Images.AddImage(image);
     image.Dispose();

     // Добавляет рамку изображения с той же высотой и шириной
     IPictureFrame pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 150, ppImage.Width, ppImage.Height, ppImage);

     // Применяет некоторое форматирование к рамке изображения
     pictureFrame.LineFormat.FillFormat.FillType = FillType.Solid;
     pictureFrame.LineFormat.FillFormat.SolidFillColor.Color = Color.Blue;
     pictureFrame.LineFormat.Width = 20;
     pictureFrame.Rotation = 45;

     // Сохраняет презентацию в файл PPTX
     pres.Save("RectPicFrameFormat_out.pptx", SaveFormat.Pptx);
 }

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

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на слайд по его индексу.
  3. Добавьте изображение в коллекцию изображений презентации.
  4. Создайте объект IPPImage, добавив изображение в IImagescollection, связанную с объектом презентации, которое будет использовано для заполнения фигуры.
  5. Укажите относительные ширину и высоту изображения в рамке.
  6. Сохраните изменённую презентацию в файл PPTX.
 // Создаёт экземпляр класса Presentation, представляющего файл PPTX
 using (Presentation presentation = new Presentation())
 {
     // Загружает изображение и добавляет его в коллекцию изображений презентации
     IImage image = Images.FromFile("aspose-logo.jpg");
     IPPImage ppImage = presentation.Images.AddImage(image);
     image.Dispose();

     // Добавляет рамку изображения на слайд
     IPictureFrame pictureFrame = presentation.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 50, 100, 100, ppImage);

     // Устанавливает относительный масштаб ширины и высоты
     pictureFrame.RelativeScaleHeight = 0.8f;
     pictureFrame.RelativeScaleWidth = 1.35f;

     // Сохраняет презентацию
     presentation.Save("Adding Picture Frame with Relative Scale_out.pptx", SaveFormat.Pptx);
 }

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

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

using (var presentation = new Presentation("sample.pptx"))
{
    var firstSlide = presentation.Slides[0];
    var firstShape = firstSlide.Shapes[0];

    if (firstShape is IPictureFrame pictureFrame)
    {
        var image = pictureFrame.PictureFormat.Picture.Image.SystemImage;
        image.Save("slide_1_shape_1.png", ImageFormat.Png);
    }
}

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

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

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

using var presentation = new Presentation("sample.pptx");

var slide = presentation.Slides[0];
var shape = slide.Shapes[0];

if (shape is IPictureFrame pictureFrame)
{
    var svgImage = pictureFrame.PictureFormat.Picture.Image.SvgImage;
    if (svgImage != null)
    {
        File.WriteAllText("output.svg", svgImage.SvgContent);
    }
}

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

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

using (var presentation = new Presentation("Test.pptx"))
{
    var pictureFrame = (IPictureFrame)presentation.Slides[0].Shapes[0];
    var imageTransform = pictureFrame.PictureFormat.Picture.ImageTransform;
    foreach (var effect in imageTransform)
    {
        if (effect is IAlphaModulateFixed alphaModulateFixed)
        {
            var transparencyValue = 100 - alphaModulateFixed.Amount;
            Console.WriteLine("Picture transparency: " + transparencyValue);
        }
    }
}

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

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

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

using (var presentation = new Presentation("sample.pptx"))
{
    var slide = presentation.Slides[0];
    var shape = slide.Shapes[0];
    var pictureFrame = (IPictureFrame)shape;

    var imageTransform = pictureFrame.PictureFormat.Picture.ImageTransform;
    foreach (var effect in imageTransform)
    {
        if (effect is ILuminance luminanceEffect)
        {
            var luminance = luminanceEffect.GetEffective();
            var brightness = luminance.Brightness;
            var contrast = luminance.Contrast;

            Console.WriteLine("Brightness: " + brightness);
            Console.WriteLine("Contrast: " + contrast);
        }
    }
}

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

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

  1. Создайте экземпляр класса Presentation .
  2. Получите ссылку на слайд по его индексу.
  3. Создайте объект IPPImage, добавив изображение в IImagescollection, связанную с объектом презентации, которое будет использовано для заполнения фигуры.
  4. Укажите ширину и высоту изображения.
  5. Создайте PictureFrame на основе ширины и высоты изображения через метод AddPictureFrame, предоставленный объектом IShapes, связанным с выбранным слайдом.
  6. Добавьте рамку изображения (содержащую картинку) на слайд.
  7. Установите цвет линии рамки изображения.
  8. Установите толщину линии рамки изображения.
  9. Поверните рамку, задав положительное или отрицательное значение.
    • Положительное значение вращает изображение по часовой стрелке.
    • Отрицательное значение вращает изображение против часовой стрелки.
  10. Добавьте рамку изображения (содержащую картинку) на слайд.
  11. Сохраните изменённую презентацию в файл PPTX.
// Создаёт экземпляр класса Presentation, представляющего файл PPTX
using (Presentation presentation = new Presentation())
{
    // Получает первый слайд
    ISlide slide = presentation.Slides[0];

    // Загружает изображение и добавляет его в коллекцию изображений презентации
    IImage image = Images.FromFile("aspose-logo.jpg");
    IPPImage ppImage = presentation.Images.AddImage(image);
    image.Dispose();

    // Добавляет рамку изображения с высотой и шириной, соответствующей изображению
    IPictureFrame pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 150, ppImage.Width, ppImage.Height, ppImage);

    // Применяет некоторое форматирование к рамке изображения
    pictureFrame.LineFormat.FillFormat.FillType = FillType.Solid;
    pictureFrame.LineFormat.FillFormat.SolidFillColor.Color = Color.Blue;
    pictureFrame.LineFormat.Width = 20;
    pictureFrame.Rotation = 45;

    // Сохраняет презентацию в файл PPTX
    presentation.Save("RectPicFrameFormat_out.pptx", SaveFormat.Pptx);
}

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

Чтобы избежать больших размеров презентаций, можно добавлять изображения (или видео) в виде ссылок, а не встраивать файлы напрямую. Этот C#‑код показывает, как добавить изображение и видео в заполнитель:

using (var presentation = new Presentation("input.pptx"))
{
    var shapesToRemove = new List<IShape>();
    int shapesCount = presentation.Slides[0].Shapes.Count;

    for (var i = 0; i < shapesCount; i++)
    {
        var autoShape = presentation.Slides[0].Shapes[i];

        if (autoShape.Placeholder == null)
        {
            continue;
        }

        switch (autoShape.Placeholder.Type)
        {
            case PlaceholderType.Picture:
                var pictureFrame = presentation.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle,
                        autoShape.X, autoShape.Y, autoShape.Width, autoShape.Height, null);

                pictureFrame.PictureFormat.Picture.LinkPathLong =
                    "https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg";

                shapesToRemove.Add(autoShape);
                break;

            case PlaceholderType.Media:
                var videoFrame = presentation.Slides[0].Shapes.AddVideoFrame(
                    autoShape.X, autoShape.Y, autoShape.Width, autoShape.Height, "");

                videoFrame.PictureFormat.Picture.LinkPathLong =
                    "https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg";

                videoFrame.LinkPathLong = "https://youtu.be/t_1LYZ102RA";

                shapesToRemove.Add(autoShape);
                break;
        }
    }

    foreach (var shape in shapesToRemove)
    {
        presentation.Slides[0].Shapes.Remove(shape);
    }

    presentation.Save("output.pptx", SaveFormat.Pptx);
}

Обрезка изображений

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

using (Presentation presentation = new Presentation())
{
    // Создаёт новый объект изображения
    IImage image = Images.FromFile(imagePath);
    IPPImage newImage = presentation.Images.AddImage(image);
    image.Dispose();

    // Добавляет рамку изображения на слайд
    IPictureFrame picFrame = presentation.Slides[0].Shapes.AddPictureFrame(
        ShapeType.Rectangle, 100, 100, 420, 250, newImage);

    // Обрезает изображение (значения в процентах)
    picFrame.PictureFormat.CropLeft = 23.6f;
    picFrame.PictureFormat.CropRight = 21.5f;
    picFrame.PictureFormat.CropTop = 3;
    picFrame.PictureFormat.CropBottom = 31;

    // Сохраняет результат
    presentation.Save("PictureFrameCrop.pptx", SaveFormat.Pptx);
}

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

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

using (Presentation presentation = new Presentation("PictureFrameCrop.pptx"))
{
    ISlide slide = presentation.Slides[0];

    // Получает рамку изображения с первого слайда
    IPictureFrame picFrame = slide.Shapes[0] as IPictureFrame;

    // Удаляет обрезанные области изображения рамки и возвращает обрезанное изображение
    IPPImage croppedImage = picFrame.PictureFormat.DeletePictureCroppedAreas();

    // Сохраняет результат
    presentation.Save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
}

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

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

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

Ниже приведены примеры C# — сжатие изображения в презентации с указанием целевого разрешения и, при желании, удалением обрезанных областей:

using (Presentation presentation = new Presentation("demo.pptx"))
{
    ISlide slide = presentation.Slides[0];
    IPictureFrame pictureFrame = slide.Shapes[0] as IPictureFrame;

    // Сжимает изображение с целевым разрешением 150 DPI (веб‑разрешение) и удаляет обрезанные области.
    bool result = pictureFrame.PictureFormat.CompressImage(true, PicturesCompression.Dpi150);

    // Проверяет результат сжатия.
    if (result)
    {
        Console.WriteLine("Image successfully compressed.");
    }
    else
    {
        Console.WriteLine("Image compression failed or no changes were necessary.");
    }

    presentation.Save("CompressedImage.pptx", SaveFormat.Pptx);
}

Или непосредственное использование произвольного значения DPI:

using (Presentation presentation = new Presentation("demo.pptx"))
{
    ISlide slide = presentation.Slides[0];
    IPictureFrame pictureFrame = slide.Shapes[0] as IPictureFrame;

    // Сжимает изображение до 150 DPI (веб разрешение), удаляя обрезанные области.
    pictureFrame.PictureFormat.CompressImage(true, 150f);

    presentation.Save("CompressedImage.pptx", SaveFormat.Pptx);
}

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

Если требуется, чтобы фигура с изображением сохраняла своё соотношение сторон после изменения размеров изображения, используйте свойство IPictureFrameLock.AspectRatioLocked для установки параметра Lock Aspect Ratio.

Этот C#‑код показывает, как заблокировать соотношение сторон фигуры:

using (Presentation pres = new Presentation("pres.pptx"))
{
    ILayoutSlide layout = pres.LayoutSlides.GetByType(SlideLayoutType.Custom);
    ISlide emptySlide = pres.Slides.AddEmptySlide(layout);

    IImage image = Images.FromFile("image.png");
    IPPImage presImage = pres.Images.AddImage(image);
    image.Dispose();

    IPictureFrame pictureFrame = emptySlide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 150, presImage.Width, presImage.Height, presImage);

    // Устанавливает форму сохранять соотношение сторон при изменении размера
    pictureFrame.PictureFrameLock.AspectRatioLocked = true;
}

Использование свойства StretchOff

С помощью свойств StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight и StretchOffsetBottom из интерфейса IPictureFillFormat и класса PictureFillFormat можно задать прямоугольник заполнения.

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

  1. Создайте экземпляр класса Presentation .
  2. Получите ссылку на слайд по его индексу.
  3. Добавьте прямоугольник AutoShape.
  4. Создайте изображение.
  5. Установите тип заливки фигуры.
  6. Задайте режим заливки изображения.
  7. Добавьте изображение для заполнения фигуры.
  8. Укажите смещения изображения от соответствующей грани ограничивающего бокса фигуры.
  9. Сохраните изменённую презентацию в файл PPTX.
using (Presentation pres = new Presentation())
{
    IImage image = Images.FromFile("image.png");
    IPPImage ppImage = pres.Images.AddImage(image);
    image.Dispose();

    IPictureFrame pictureFrame = pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 400, 400, ppImage);

    // Устанавливает растягивание изображения со всех сторон внутри фигуры
    pictureFrame.PictureFormat.PictureFillMode = PictureFillMode.Stretch;
    pictureFrame.PictureFormat.StretchOffsetLeft = 24;
    pictureFrame.PictureFormat.StretchOffsetRight = 24;
    pictureFrame.PictureFormat.StretchOffsetTop = 24;
    pictureFrame.PictureFormat.StretchOffsetBottom = 24;

    pres.Save("imageStretch.pptx", SaveFormat.Pptx);
}

Часто задаваемые вопросы

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

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

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

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

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

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

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

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