Управление рамками изображений в презентациях на Android
Введение
Рамка изображения — это фигура, содержащая изображение, она похожа на картину в рамке.
Вы можете добавить изображение на слайд через рамку изображения. Таким образом, вы форматируете изображение, форматируя рамку.
Tip
Aspose предоставляет бесплатные конвертеры —JPEG в PowerPoint и PNG в 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 Android via 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 позволяет получить эффекты яркости и контрастности, применённые к изображению. Интерфейс ILuminance представляет это преобразование изображения.
Этот Java‑код демонстрирует, как получить настройки яркости и контрастности из рамки изображения:
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);
IPictureFrame pictureFrame = (IPictureFrame) shape;
IImageTransformOperationCollection imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
for (IImageTransformOperation effect : imageTransform) {
if (effect instanceof ILuminance) {
ILuminanceEffectiveData luminance = ((ILuminance) effect).getEffective();
float brightness = luminance.getBrightness();
float contrast = luminance.getContrast();
System.out.println("Brightness: " + brightness);
System.out.println("Contrast: " + contrast);
}
}
} finally {
presentation.dispose();
}
Форматирование рамки изображения
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();
}
// Добавляет рамку изображения на слайд
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);
// Получает рамку изображения с первого слайда
IPictureFrame picFrame = (IPictureFrame)slide.getShapes().get_Item(0);
// Удаляет обрезанные области изображения рамки и возвращает обрезанное изображение
IPPImage croppedImage = picFrame.getPictureFormat().deletePictureCroppedAreas();
// Сохраняет результат
presentation.save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
} finally {
if (presentation != null) presentation.dispose();
}
NOTE
Метод deletePictureCroppedAreas() добавляет обрезанное изображение в коллекцию изображений презентации. Если изображение используется только в обработанной PictureFrame, такая настройка может уменьшить размер презентации. В противном случае количество изображений в полученной презентации увеличится.
Метод конвертирует метафайлы WMF/EMF в растровое PNG‑изображение во время операции обрезки.
Сжатие изображений
Вы можете сжать изображение в презентации, используя метод IPictureFillFormat.compressImage. Этот метод уменьшает размер изображения, исходя из размеров фигуры и заданного разрешения, с возможностью удаления обрезанных областей.
Он регулирует размер и разрешение изображения аналогично функции PowerPoint Picture Format > Compress Pictures > Resolution.
Следующие примеры на Java демонстрируют, как сжать изображение в презентации, указав целевое разрешение и, при необходимости, удалив обрезанные области:
Presentation presentation = new Presentation("demo.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = (IPictureFrame)slide.getShapes().get_Item(0);
// Сжимает изображение с целевым разрешением 150 DPI (веб‑разрешение) и удаляет обрезанные области.
boolean result = pictureFrame.getPictureFormat().compressImage(true, PicturesCompression.Dpi150);
// Проверяет результат сжатия.
if (result) {
System.out.println("Image successfully compressed.");
} else {
System.out.println("Image compression failed or no changes were necessary.");
}
presentation.save("CompressedImage.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Или напрямую используя пользовательское значение DPI:
Presentation presentation = new Presentation("demo.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = (IPictureFrame)slide.getShapes().get_Item(0);
// Сжимает изображение до 150 DPI (веб-разрешение), удаляя обрезанные области.
pictureFrame.getPictureFormat().compressImage(true, 150f);
presentation.save("CompressedImage.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
NOTE
Метод преобразует изображение к более низкому разрешению, исходя из размеров фигуры и заданного DPI. Обрезанные области также могут быть удалены для оптимизации размера файла.Если изображение является метафайлом (WMF/EMF) или SVG, сжатие не применяется. Кроме того, качество JPEG сохраняется или слегка снижается в зависимости от разрешения, аналогично тому, как PowerPoint обрабатывает JPEG‑изображения высокого разрешения.
Блокировка соотношения сторон
Если требуется, чтобы фигура с изображением сохраняла своё соотношение сторон даже после изменения размеров изображения, можно использовать метод 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();
}
Часто задаваемые вопросы
Как узнать, какие форматы изображений поддерживаются в PictureFrame?
Aspose.Slides поддерживает как растровые изображения (PNG, JPEG, BMP, GIF и т.д.), так и векторные (например, SVG) через объект изображения, назначенный PictureFrame. Список поддерживаемых форматов в целом совпадает с возможностями движка конвертации слайдов и изображений.
Как добавление десятков больших изображений повлияет на размер и производительность PPTX?
Встраивание больших изображений увеличивает размер файла и потребление памяти; привязка изображений через ссылки помогает уменьшить размер презентации, но требует доступности внешних файлов. Aspose.Slides позволяет добавлять изображения по ссылке для снижения размера файла.
Как заблокировать объект изображения от случайного перемещения/изменения размера?
Используйте блокировку фигур для PictureFrame (например, отключите перемещение или изменение размеров). Механизм блокировки поддерживается для различных типов фигур, включая PictureFrame.
Сохраняется ли векторная точность SVG при экспорте презентации в PDF/изображения?
Aspose.Slides позволяет извлекать SVG из PictureFrame как оригинальный вектор. При экспорте в PDF или растровые форматы результат может быть растровым в зависимости от настроек экспорта; факт того, что оригинальный SVG хранится как вектор, подтверждается поведением функции извлечения.