Управление рамками изображений в презентациях с использованием Java
Рамка изображения — это форма, содержащая изображение, она похожа на картину в рамке.
Вы можете добавить изображение на слайд через рамку изображения. Таким образом, вы форматируете изображение, изменяя свойства рамки изображения.
Tip
Aspose предоставляет бесплатные конвертеры —JPEG to PowerPoint и PNG to PowerPoint — позволяющие быстро создавать презентации из изображений.Создать рамку изображения
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Создайте объект IPPImage путем добавления изображения в IImagescollection, связанный с объектом презентации, который будет использоваться для заполнения формы.
- Укажите ширину и высоту изображения.
- Создайте 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 путем добавления изображения в IImagescollection, связанный с объектом презентации, который будет использоваться для заполнения формы.
- Укажите относительную ширину и высоту изображения в рамке.
- Сохраните изменённую презентацию в файл 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 путем добавления изображения в IImagescollection, связанный с объектом презентации, который будет использоваться для заполнения формы.
- Укажите ширину и высоту изображения.
- Создайте
PictureFrameна основе ширины и высоты изображения через метод AddPictureFrame объекта IShapes, связанного с указанным слайдом. - Добавьте рамку изображения (содержит картинку) на слайд.
- Установите цвет линии рамки изображения.
- Установите ширину линии рамки изображения.
- Поверните рамку изображения, задав ей положительное или отрицательное значение.
- Положительное значение поворачивает изображение по часовой стрелке.
- Отрицательное значение поворачивает изображение против часовой стрелки.
- Добавьте рамку изображения (содержит картинку) на слайд.
- Сохраните изменённую презентацию в файл 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();
}
Tip
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();
}
NOTE
Метод deletePictureCroppedAreas() добавляет обрезанное изображение в коллекцию изображений презентации. Если изображение используется только в обработанном PictureFrame, такая настройка может снизить размер презентации. В противном случае количество изображений в полученной презентации увеличится.
Метод конвертирует метафайлы WMF/EMF в растровое PNG‑изображение в процессе обрезки.
Блокировка пропорций
Если вы хотите, чтобы форма, содержащая изображение, сохраняла свои пропорции после изменения размеров изображения, используйте метод setAspectRatioLocked для установки параметра Lock Aspect Ratio.
Этот 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);
// установить форму, чтобы сохранять соотношение сторон при изменении размера
pictureFrame.getPictureFrameLock().setAspectRatioLocked(true);
} catch(IOException e) {
} finally {
if (pres != null) pres.dispose();
}
NOTE
Параметр Lock Aspect Ratio сохраняет только пропорции формы, а не самого изображения.Использование свойства 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 предоставляет возможность добавлять изображения по ссылке для уменьшения размера файла.
Как заблокировать объект изображения от случайного перемещения/изменения размера?
Используйте shape locks для PictureFrame (например, отключить перемещение или изменение размера). Механизм блокировки описан в отдельной статье о защите форм [/slides/java/applying-protection-to-presentation/] и поддерживается различными типами форм, включая PictureFrame.
Сохраняется ли векторная точность SVG при экспорте презентации в PDF/изображения?
Aspose.Slides позволяет извлекать SVG из PictureFrame в оригинальном векторном виде. При экспорте в PDF или растровые форматы результат может быть растровым в зависимости от настроек экспорта; факт того, что оригинальный SVG хранится как вектор, подтверждается поведением извлечения.