Управление рамками изображений в презентациях с помощью Java
Рамка изображения — это фигура, содержащая изображение; она похожа на картину в рамке.
Вы можете добавить изображение на слайд через рамку изображения. Таким образом, вы форматируете изображение, форматируя рамку.
Подсказка
Aspose предоставляет бесплатные конвертеры — JPEG в PowerPoint и PNG в PowerPoint — которые позволяют быстро создавать презентации из изображений.Создать рамку изображения
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Создайте объект IPPImage путем добавления изображения в IImageCollection, связанный с объектом презентации, который будет использован для заполнения фигуры.
- Укажите ширину и высоту изображения.
- Создайте PictureFrame на основе ширины и высоты изображения через метод
AddPictureFrame, предоставляемый объектом фигур, связанным с выбранным слайдом. - Добавьте рамку изображения (с содержащейся картинкой) на слайд.
- Сохраните изменённую презентацию в виде файла PPTX.
Этот Java‑код показывает, как создать рамку изображения:
// Создает экземпляр класса Presentation, который представляет файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
ISlide sld = pres.getSlides().get_Item(0);
// Создает экземпляр класса Image
IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
// Добавляет рамку изображения с эквивалентной высотой и шириной картинки
sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
// Записывает файл PPTX на диск
pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
Создать рамку изображения с относительным масштабом
Изменяя относительное масштабирование изображения, можно создать более сложную рамку изображения.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Добавьте изображение в коллекцию изображений презентации.
- Создайте объект IPPImage путем добавления изображения в IImageCollection, связанный с объектом презентации, который будет использован для заполнения фигуры.
- Укажите относительную ширину и высоту изображения в рамке.
- Сохраните изменённую презентацию в виде файла PPTX.
Этот Java‑код демонстрирует, как создать рамку изображения с относительным масштабом:
// Создает экземпляр класса Presentation, который представляет файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
ISlide sld = pres.getSlides().get_Item(0);
// Создает экземпляр класса Image
IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
// Добавляет рамку изображения с высотой и шириной, эквивалентными картинке
IPictureFrame pf = sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
// Устанавливает относительный масштаб ширины и высоты
pf.setRelativeScaleHeight(0.8f);
pf.setRelativeScaleWidth(1.35f);
// Записывает файл PPTX на диск
pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
Извлечение растровых изображений из рамок
Вы можете извлекать растровые изображения из объектов PictureFrame и сохранять их в форматах PNG, JPG и других. Пример кода ниже показывает, как извлечь изображение из документа «sample.pptx» и сохранить его в формате PNG.
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide firstSlide = presentation.getSlides().get_Item(0);
IShape firstShape = firstSlide.getShapes().get_Item(0);
if (firstShape instanceof IPictureFrame) {
IPictureFrame pictureFrame = (IPictureFrame) firstShape;
try {
IImage slideImage = pictureFrame.getPictureFormat().getPicture().getImage().getImage();
slideImage.save("slide_1_shape_1.png", ImageFormat.Png);
} finally {
if (slideImage != null) slideImage.dispose();
}
}
} catch (IOException e) {
} finally {
presentation.dispose();
}
Извлечение SVG‑изображений из рамок
Когда презентация содержит SVG‑графику, размещённую внутри фигур PictureFrame, Aspose.Slides for Java позволяет получить оригинальные векторные изображения с полной точностью. Путём обхода коллекции фигур слайда вы можете определить каждую PictureFrame, проверить, содержит ли лежащий в основе IPPImage SVG‑контент, и затем сохранить это изображение на диск или в поток в его родном SVG‑формате.
Следующий пример кода демонстрирует, как извлечь SVG‑изображение из рамки:
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);
if (shape instanceof IPictureFrame) {
IPictureFrame pictureFrame = (IPictureFrame) shape;
ISvgImage svgImage = pictureFrame.getPictureFormat().getPicture().getImage().getSvgImage();
FileOutputStream fos = new FileOutputStream("output.svg");
fos.write(svgImage.getSvgData());
fos.close();
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
presentation.dispose();
}
Получение прозрачности изображения
Aspose.Slides позволяет получить эффект прозрачности, применённый к изображению. Этот Java‑код демонстрирует операцию:
Presentation presentation = new Presentation("Test.pptx");
var pictureFrame = (IPictureFrame) presentation.getSlides().get_Item(0).getShapes().get_Item(0);
var imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
for (var effect : imageTransform) {
if (effect instanceof IAlphaModulateFixed) {
var alphaModulateFixed = (IAlphaModulateFixed) effect;
var transparencyValue = 100 - alphaModulateFixed.getAmount();
System.out.println("Picture transparency: " + transparencyValue);
}
}
Форматирование рамки изображения
Aspose.Slides предоставляет множество параметров форматирования, которые можно применить к рамке изображения. Используя их, вы можете изменить рамку, чтобы она соответствовала конкретным требованиям.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Создайте объект IPPImage путем добавления изображения в IImageCollection, связанный с объектом презентации, который будет использован для заполнения фигуры.
- Укажите ширину и высоту изображения.
- Создайте
PictureFrameна основе ширины и высоты изображения через метод AddPictureFrame объекта IShapeCollection, связанного с выбранным слайдом. - Добавьте рамку изображения (со включённой картинкой) на слайд.
- Установите цвет линии рамки.
- Установите толщину линии рамки.
- Поверните рамку, задав ей положительное или отрицательное значение.
- Положительное значение вращает изображение по часовой стрелке.
- Отрицательное значение вращает изображение против часовой стрелки.
- Добавьте рамку изображения (со включённой картинкой) на слайд.
- Сохраните изменённую презентацию в виде файла PPTX.
Этот Java‑код демонстрирует процесс форматирования рамки изображения:
// Создает экземпляр класса Presentation, который представляет файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
ISlide sld = pres.getSlides().get_Item(0);
// Создает экземпляр класса Image
IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
// Добавляет рамку изображения с высотой и шириной, эквивалентными картинке
IPictureFrame pf = sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
// Применяет некоторое форматирование к PictureFrameEx
pf.getLineFormat().getFillFormat().setFillType(FillType.Solid);
pf.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLUE);
pf.getLineFormat().setWidth(20);
pf.setRotation(45);
// Записывает файл PPTX на диск
pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
Подсказка
Aspose недавно разработал бесплатный Collage Maker. Если вам нужно объединить JPG/JPEG или PNG‑изображения, создать сетку из фотографий, вы можете воспользоваться этим сервисом.Добавить изображение как ссылку
Чтобы избежать увеличения размера презентации, можно добавлять изображения (или видео) через ссылки вместо встраивания файлов непосредственно в презентацию. Этот Java‑код показывает, как добавить изображение и видео в заполнитель:
Presentation presentation = new Presentation("input.pptx");
try {
ArrayList<IShape> shapesToRemove = new ArrayList<IShape>();
int shapesCount = presentation.getSlides().get_Item(0).getShapes().size();
for (int i = 0; i < shapesCount; i++)
{
IShape autoShape = presentation.getSlides().get_Item(0).getShapes().get_Item(i);
if (autoShape.getPlaceholder() == null)
{
continue;
}
switch (autoShape.getPlaceholder().getType())
{
case PlaceholderType.Picture:
IPictureFrame pictureFrame = presentation.getSlides().get_Item(0).getShapes().addPictureFrame(ShapeType.Rectangle,
autoShape.getX(), autoShape.getY(), autoShape.getWidth(), autoShape.getHeight(), null);
pictureFrame.getPictureFormat().getPicture().setLinkPathLong(
"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:
IVideoFrame videoFrame = presentation.getSlides().get_Item(0).getShapes().addVideoFrame(
autoShape.getX(), autoShape.getY(), autoShape.getWidth(), autoShape.getHeight(), "");
videoFrame.getPictureFormat().getPicture().setLinkPathLong(
"https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg");
videoFrame.setLinkPathLong("https://youtu.be/t_1LYZ102RA");
shapesToRemove.add(autoShape);
break;
}
}
for (IShape shape : shapesToRemove)
{
presentation.getSlides().get_Item(0).getShapes().remove(shape);
}
presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
if (presentation != null) presentation.dispose();
}
Обрезка изображений
Этот Java‑код показывает, как обрезать существующее изображение на слайде:
Presentation pres = new Presentation();
// Создает новый объект изображения
try {
IPPImage picture;
IImage image = Images.fromFile(imagePath);
try {
picture = pres.getImages().addImage(image);
} finally {
if (image != null) image.dispose();
}
// Добавляет PictureFrame на слайд
IPictureFrame picFrame = pres.getSlides().get_Item(0).getShapes().addPictureFrame(
ShapeType.Rectangle, 100, 100, 420, 250, picture);
// Обрезает изображение (значения в процентах)
picFrame.getPictureFormat().setCropLeft(23.6f);
picFrame.getPictureFormat().setCropRight(21.5f);
picFrame.getPictureFormat().setCropTop(3);
picFrame.getPictureFormat().setCropBottom(31);
// Сохраняет результат
pres.save(outPptxFile, SaveFormat.Pptx);
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
Удаление обрезанных областей рамки
Если требуется удалить обрезанные области изображения, находящегося в рамке, можно воспользоваться методом deletePictureCroppedAreas(). Метод возвращает обрезанное изображение или оригинал, если обрезка не требуется.
Этот Java‑код демонстрирует операцию:
Presentation presentation = new Presentation("PictureFrameCrop.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
// Получает PictureFrame с первого слайда
IPictureFrame picFrame = (IPictureFrame)slide.getShapes().get_Item(0);
// Удаляет обрезанные области изображения PictureFrame и возвращает обрезанное изображение
IPPImage croppedImage = picFrame.getPictureFormat().deletePictureCroppedAreas();
// Сохраняет результат
presentation.save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
} finally {
if (presentation != null) presentation.dispose();
}
ПРИМЕЧАНИЕ
Метод deletePictureCroppedAreas() добавляет обрезанное изображение в коллекцию изображений презентации. Если изображение используется только в обработанной PictureFrame, такой подход может уменьшить размер презентации. В противном случае количество изображений в полученной презентации увеличится.
Метод конвертирует метафайлы WMF/EMF в растровое PNG‑изображение при выполнении обрезки.
Блокировка соотношения сторон
Если необходимо, чтобы фигура, содержащая изображение, сохраняла своё соотношение сторон после изменения размеров изображения, используйте метод setAspectRatioLocked для установки параметра Блокировать соотношение сторон.
Этот Java‑код показывает, как заблокировать соотношение сторон фигуры:
Presentation pres = new Presentation("pres.pptx");
try {
ILayoutSlide layout = pres.getLayoutSlides().getByType(SlideLayoutType.Custom);
ISlide emptySlide = pres.getSlides().addEmptySlide(layout);
IPPImage picture;
IImage image = Images.fromFile("image.png");
try {
picture = pres.getImages().addImage(image);
} finally {
if (image != null) image.dispose();
}
IPictureFrame pictureFrame = emptySlide.getShapes().addPictureFrame(
ShapeType.Rectangle, 50, 150, presImage.getWidth(), presImage.getHeight(), picture);
// установить, чтобы при изменении размера сохранялось соотношение сторон
} catch(IOException e) {
} finally {
if (pres != null) pres.dispose();
}
ПРИМЕЧАНИЕ
Параметр Блокировать соотношение сторон сохраняет только соотношение сторон самой фигуры, а не изображения, которое она содержит.Использование свойства StretchOff
Используя свойства StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight и StretchOffsetBottom интерфейса IPictureFillFormat и класса PictureFillFormat можно задать прямоугольник заливки.
Когда для изображения задаётся растягивание, исходный прямоугольник масштабируется до размеров указанного прямоугольника заливки. Каждая грань прямоугольника заливки определяется процентным смещением от соответствующей грани ограничивающего прямоугольника фигуры. Положительный процент задаёт внутреннее смещение, а отрицательный — внешнее.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Добавьте прямоугольник
AutoShape. - Создайте изображение.
- Установите тип заливки фигуры.
- Установите режим заливки изображением.
- Добавьте изображение для заливки фигуры.
- Укажите смещения изображения от соответствующей грани ограничивающего прямоугольника фигуры.
- Сохраните изменённую презентацию в виде файла PPTX.
Этот Java‑код демонстрирует процесс использования свойства StretchOff:
// Создаёт экземпляр класса Presentation, который представляет файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
ISlide slide = pres.getSlides().get_Item(0);
// Создаёт экземпляр класса ImageEx
IPPImage picture;
IImage image = Images.fromFile("aspose-logo.jpg");
try {
picture = pres.getImages().addImage(image);
} finally {
if (image != null) image.dispose();
}
// Добавляет AutoShape типа Rectangle
IAutoShape aShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);
// Устанавливает тип заливки фигуры
aShape.getFillFormat().setFillType(FillType.Picture);
// Устанавливает режим заливки изображения фигуры
aShape.getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch);
// Устанавливает изображение для заливки фигуры
aShape.getFillFormat().getPictureFillFormat().getPicture().setImage(picture);
// Указывает смещения изображения от соответствующей грани ограничивающего прямоугольника фигуры
aShape.getFillFormat().getPictureFillFormat().setStretchOffsetLeft(25);
aShape.getFillFormat().getPictureFillFormat().setStretchOffsetRight(25);
aShape.getFillFormat().getPictureFillFormat().setStretchOffsetTop(-20);
aShape.getFillFormat().getPictureFillFormat().setStretchOffsetBottom(-10);
// Записывает файл PPTX на диск
pres.save("StretchOffsetLeftForPictureFrame_out.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
FAQ
Как узнать, какие форматы изображений поддерживаются для PictureFrame?
Aspose.Slides поддерживает как растровые изображения (PNG, JPEG, BMP, GIF и др.), так и векторные (например, SVG) через объект изображения, назначенный PictureFrame. Список поддерживаемых форматов в целом совпадает с возможностями движка конвертации слайдов и изображений.
Как добавление десятков больших изображений скажется на размере и производительности PPTX?
Встраивание больших изображений увеличивает размер файла и потребление памяти; привязывание изображений помогает уменьшить размер презентации, но требует доступности внешних файлов. Aspose.Slides предоставляет возможность добавлять изображения по ссылке для снижения размера файла.
Как заблокировать объект изображения от случайного перемещения/изменения размера?
Используйте блокировки фигур для PictureFrame (например, отключить перемещение или изменение размера). Механизм блокировки описан в отдельной статье о защите и поддерживается для различных типов фигур, включая PictureFrame.
Сохраняется ли векторное качество SVG при экспорте презентации в PDF/изображения?
Aspose.Slides позволяет извлекать SVG из PictureFrame в виде оригинального вектора. При экспорте в PDF или растровые форматы результат может быть растровым в зависимости от настроек экспорта; факт того, что оригинальный SVG сохраняется как вектор, подтверждается поведением извлечения.