Управление рамками изображений в презентациях на .NET
Рамка изображения — это форма, содержащая изображение; она похожа на картину в рамке.
Вы можете добавить изображение на слайд через рамку изображения. Таким образом, вы форматируете изображение, форматируя рамку изображения.
Tip
Aspose предоставляет бесплатные конвертеры — JPEG to PowerPoint и PNG to PowerPoint — которые позволяют быстро создавать презентации из изображений.Создать рамку изображения
- Создать экземпляр класса Presentation.
- Получить ссылку на слайд по его индексу.
- Создать объект IPPImage, добавив изображение в коллекцию IImagescollection, связанную с объектом презентации, которое будет использовано для заполнения формы.
- Указать ширину и высоту изображения.
- Создать PictureFrame на основе ширины и высоты изображения через метод
AddPictureFrame, предоставляемый объектом формы, связанным с указанным слайдом. - Добавить рамку изображения (содержащую картинку) на слайд.
- Сохранить изменённую презентацию в файл PPTX.
Этот C#‑код показывает, как создать рамку изображения:
// Создает экземпляр класса 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);
}
Создать рамку изображения с относительным масштабом
Изменяя относительное масштабирование изображения, можно создать более сложную рамку изображения.
- Создать экземпляр класса Presentation.
- Получить ссылку на слайд по его индексу.
- Добавить изображение в коллекцию изображений презентации.
- Создать объект IPPImage, добавив изображение в коллекцию IImagescollection, связанную с объектом презентации, которое будет использовано для заполнения формы.
- Указать относительную ширину и высоту изображения в рамке изображения.
- Сохранить изменённую презентацию в файл PPTX.
Этот C#‑код показывает, как создать рамку изображения с относительным масштабом:
// Создает экземпляр класса 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 for .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 предоставляет множество параметров форматирования, которые можно применить к рамке изображения. С их помощью можно изменить рамку изображения так, чтобы она соответствовала конкретным требованиям.
- Создать экземпляр класса Presentation .
- Получить ссылку на слайд по его индексу.
- Создать объект IPPImage, добавив изображение в коллекцию IImagescollection, связанную с объектом презентации, которое будет использовано для заполнения формы.
- Указать ширину и высоту изображения.
- Создать
PictureFrameна основе ширины и высоты изображения через метод AddPictureFrame, предоставляемый объектом IShapes, связанным с указанным слайдом. - Добавить рамку изображения (содержащую картинку) на слайд.
- Задать цвет линии рамки изображения.
- Задать ширину линии рамки изображения.
- Повернуть рамку изображения, указав положительное или отрицательное значение.
- Положительное значение вращает изображение по часовой стрелке.
- Отрицательное значение вращает изображение против часовой стрелки.
- Добавить рамку изображения (содержащую картинку) на слайд.
- Сохранить изменённую презентацию в файл PPTX.
Этот C#‑код демонстрирует процесс форматирования рамки изображения:
// Создает экземпляр класса 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();
// Добавляет PictureFrame на слайд
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. Метод возвращает обрезанное изображение или исходное, если обрезка не требуется.
Этот C#‑код демонстрирует операцию:
using (Presentation presentation = new Presentation("PictureFrameCrop.pptx"))
{
ISlide slide = presentation.Slides[0];
// Получает PictureFrame с первого слайда
IPictureFrame picFrame = slide.Shapes[0] as IPictureFrame;
// Удаляет обрезанные области изображения PictureFrame и возвращает обрезанное изображение
IPPImage croppedImage = picFrame.PictureFormat.DeletePictureCroppedAreas();
// Сохраняет результат
presentation.Save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
}
NOTE
Метод IPictureFillFormat.DeletePictureCroppedAreas добавляет обрезанное изображение в коллекцию изображений презентации. Если изображение используется только в обработанном PictureFrame, такая настройка может уменьшить размер презентации. В противном случае количество изображений в получившейся презентации увеличится.
Метод преобразует WMF/EMF‑метафайлы в растровое PNG‑изображение в процессе обрезки.
Сжать изображения
Вы можете сжать изображение в презентации, используя метод IPictureFillFormat.CompressImage.
Метод уменьшает размер изображения, учитывая размер формы и указанное разрешение, с возможностью удаления обрезанных областей.
Он регулирует размер и разрешение картинки аналогично функции PowerPoint Picture Format → Compress Pictures → Resolution.
Ниже приведены примеры C#‑кода, показывающие, как сжать изображение в презентации, задав целевое разрешение и, при желании, удалив обрезанные области:
using (Presentation presentation = new Presentation("demo.pptx"))
{
ISlide slide = presentation.Slides[0];
// Получить PictureFrame со слайда
IPictureFrame picFrame = slide.Shapes[0] as IPictureFrame;
// Сжать изображение с целевым разрешением 150 DPI (веб-разрешение) и удалить обрезанные области
bool result = picFrame.PictureFormat.CompressImage(true, PicturesCompression.Dpi150);
// Проверить результат сжатия
if (result)
{
Console.WriteLine("Image successfully compressed.");
}
else
{
Console.WriteLine("Image compression failed or no changes were necessary.");
}
}
Или с указанием пользовательского DPI напрямую:
using (Presentation presentation = new Presentation("demo.pptx"))
{
ISlide slide = presentation.Slides[0];
IPictureFrame picFrame = slide.Shapes[0] as IPictureFrame;
// Сжать изображение до 150 DPI (веб разрешение), удаляя обрезанные области
bool result = picFrame.PictureFormat.CompressImage(true, 150f);
}
NOTE
Метод преобразует изображение к более низкому разрешению в зависимости от размера формы и указанного DPI. Обрезанные области также могут быть удалены для оптимизации размера файла.Если изображение — метафайл (WMF/EMF) или SVG, сжатие не применяется. При этом качество JPEG сохраняется или слегка снижается в зависимости от разрешения, аналогично обработке в PowerPoint.
Блокировать соотношение сторон
Если необходимо, чтобы форма, содержащая изображение, сохраняла своё соотношение сторон после изменения размеров изображения, можно воспользоваться свойством 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;
}
NOTE
Параметр Lock Aspect Ratio сохраняет только соотношение сторон формы, но не самого изображения, которое она содержит.Использовать свойства StretchOffset
Используя свойства StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight и StretchOffsetBottom интерфейса IPictureFillFormat и класса PictureFillFormat можно задать прямоугольник заполнения.
При указании растягивания изображения исходный прямоугольник масштабируется так, чтобы вместиться в заданный прямоугольник заполнения. Каждая сторона прямоугольника заполнения определяется процентным смещением от соответствующей стороны ограничивающего бокса формы. Положительный процент задаёт отступ, отрицательный — выступ.
- Создать экземпляр класса Presentation .
- Получить ссылку на слайд по его индексу.
- Добавить прямоугольник
AutoShape. - Создать изображение.
- Задать тип заполнения формы.
- Задать режим заполнения формы картинкой.
- Добавить изображение для заполнения формы.
- Указать смещения изображения от соответствующей стороны ограничивающего бокса формы.
- Сохранить изменённую презентацию в файл PPTX.
Этот C#‑код демонстрирует процесс, в котором используется свойство StretchOffset:
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);
}
FAQ
Как узнать, какие форматы изображений поддерживаются для PictureFrame?
Aspose.Slides поддерживает как растровые изображения (PNG, JPEG, BMP, GIF и т.д.), так и векторные (например, SVG) через объект изображения, присваиваемый PictureFrame. Список поддерживаемых форматов в целом совпадает с возможностями движка конвертации слайдов и изображений.
Как добавление десятков больших изображений влияет на размер и производительность PPTX?
Встраивание больших изображений увеличивает размер файла и потребление памяти; ссылки на изображения позволяют снизить размер презентации, но требуют постоянного доступа к внешним файлам. Aspose.Slides предоставляет возможность добавлять изображения по ссылке для уменьшения размера файла.
Как заблокировать объект изображения от случайного перемещения/изменения размеров?
Используйте shape locks для PictureFrame (например, отключите перемещение или изменение размеров). Механизм блокировки описан в статье о защите фигур [/slides/net/applying-protection-to-presentation/] и поддерживается различными типами фигур, включая PictureFrame.
Сохраняется ли векторная точность SVG при экспорте презентации в PDF/изображения?
Aspose.Slides позволяет извлечь SVG из PictureFrame как оригинальный вектор. При экспорте в PDF или растровые форматы результат может быть растровым в зависимости от настроек экспорта; факт хранения оригинального SVG как вектора подтверждается поведением извлечения.