Управление рамками изображений в презентациях с использованием PHP
Рамка изображения — это фигура, содержащая изображение, она похожа на картину в рамке.
Вы можете добавить изображение на слайд через рамку изображения. Таким образом, вы форматируете изображение, форматируя рамку.
Tip
Aspose предоставляет бесплатные конвертеры—JPEG в PowerPoint и PNG в PowerPoint—которые позволяют быстро создавать презентации из изображений.Создание рамки изображения
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Создайте объект PPImage путем добавления изображения в ImageCollection, связанную с объектом презентации, который будет использоваться для заполнения фигуры.
- Укажите ширину и высоту изображения.
- Создайте PictureFrame на основе ширины и высоты изображения с помощью метода
addPictureFrame, предоставленного объектом фигуры, связанным с выбранным слайдом. - Добавьте рамку изображения (содержащую картинку) на слайд.
- Запишите изменённую презентацию в файл PPTX.
Этот код PHP показывает, как создать рамку изображения:
# Создает экземпляр класса Presentation, представляющего файл PPTX
$pres = new Presentation();
try {
# Получает первый слайд
$sld = $pres->getSlides()->get_Item(0);
# Создает экземпляр класса Image
$imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
# Добавляет рамку изображения с высотой и шириной, соответствующей изображению
$sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
# Записывает файл PPTX на диск
$pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Создание рамки изображения с относительным масштабом
Изменяя относительное масштабирование изображения, можно создать более сложную рамку изображения.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Добавьте изображение в коллекцию изображений презентации.
- Создайте объект PPImage путем добавления изображения в ImageCollection, связанную с объектом презентации, который будет использоваться для заполнения фигуры.
- Укажите относительные ширину и высоту изображения в рамке изображения.
- Запишите изменённую презентацию в файл PPTX.
Этот код PHP показывает, как создать рамку изображения с относительным масштабом:
# Создает экземпляр класса Presentation, представляющего PPTX
$pres = new Presentation();
try {
# Получает первый слайд
$sld = $pres->getSlides()->get_Item(0);
# Создает экземпляр класса Image
$imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
# Добавляет рамку изображения с высотой и шириной, эквивалентными изображению
$pf = $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
# Установка относительного масштаба ширины и высоты
$pf->setRelativeScaleHeight(0.8);
$pf->setRelativeScaleWidth(1.35);
# Записывает файл PPTX на диск
$pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Извлечение растровых изображений из рамок изображения
Вы можете извлечь растровые изображения из объектов PictureFrame , а также сохранить их в PNG, JPG и другие форматы. Пример кода ниже демонстрирует, как извлечь изображение из документа “sample.pptx” и сохранить его в формате PNG.
$presentation = new Presentation("sample.pptx");
try {
$firstSlide = $presentation->getSlides()->get_Item(0);
$firstShape = $firstSlide->getShapes()->get_Item(0);
if (java_instanceof($firstShape, new JavaClass("com.aspose.slides.PictureFrame"))) {
$pictureFrame = $firstShape;
try {
$slideImage = $pictureFrame->getPictureFormat()->getPicture()->getImage()->getImage();
$slideImage->save("slide_1_shape_1.png", ImageFormat::Png);
} finally {
if (!java_is_null($slideImage)) {
$slideImage->dispose();
}
}
}
} catch (JavaException $e) {
} finally {
$presentation->dispose();
}
Извлечение SVG‑изображений из рамок изображения
Когда презентация содержит графику SVG, размещённую внутри фигур PictureFrame, Aspose.Slides для PHP через Java позволяет извлечь оригинальные векторные изображения с полной точностью. Проходя по коллекции фигур слайда, можно определить каждый PictureFrame, проверить, содержит ли базовый PPImage контент SVG, а затем сохранить это изображение на диск или в поток в его нативном формате SVG.
Следующий пример кода демонстрирует, как извлечь SVG‑изображение из рамки изображения:
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
if (java_instanceof($shape, new JavaClass("com.aspose.slides.PictureFrame"))) {
$svgImage = $shape->getPictureFormat()->getPicture()->getImage()->getSvgImage();
if ($svgImage !== null) {
file_put_contents("output.svg", $svgImage->getSvgData());
}
}
} finally {
$presentation->dispose();
}
Получение прозрачности изображения
Aspose.Slides позволяет получить эффект прозрачности, применённый к изображению. Этот код PHP демонстрирует операцию:
$presentation = new Presentation("Test.pptx");
$pictureFrame = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
$imageTransform = $pictureFrame->getPictureFormat()->getPicture()->getImageTransform();
foreach($imageTransform as $effect) {
if (java_instanceof($effect, new JavaClass("com.aspose.slides.AlphaModulateFixed"))) {
$alphaModulateFixed = $effect;
$transparencyValue = 100 - $alphaModulateFixed->getAmount();
echo("Picture transparency: " . $transparencyValue);
}
}
Форматирование рамки изображения
Aspose.Slides предоставляет множество вариантов форматирования, которые можно применить к рамке изображения. С их помощью можно изменить рамку изображения, чтобы она соответствовала определённым требованиям.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Создайте объект PPImage путем добавления изображения в ImageCollection, связанную с объектом презентации, который будет использоваться для заполнения фигуры.
- Укажите ширину и высоту изображения.
- Создайте
PictureFrameна основе ширины и высоты изображения с помощью метода addPictureFrame, предоставленного объектом ShapeCollection, связанным с выбранным слайдом. - Добавьте рамку изображения (содержащую картинку) на слайд.
- Установите цвет линии рамки изображения.
- Установите толщину линии рамки изображения.
- Поверните рамку изображения, задав ей положительное или отрицательное значение.
- Положительное значение вращает изображение по часовой стрелке.
- Отрицательное значение вращает изображение против часовой стрелки.
- Добавьте рамку изображения (содержащую картинку) на слайд.
- Запишите изменённую презентацию в файл PPTX.
Этот код PHP демонстрирует процесс форматирования рамки изображения:
# Создает экземпляр класса Presentation, представляющего PPTX
$pres = new Presentation();
try {
# Получает первый слайд
$sld = $pres->getSlides()->get_Item(0);
# Создает экземпляр класса Image
$imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
# Добавляет рамку изображения с высотой и шириной, эквивалентными изображению
$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(java("java.awt.Color")->BLUE);
$pf->getLineFormat()->setWidth(20);
$pf->setRotation(45);
# Записывает файл PPTX на диск
$pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Tip
Aspose недавно разработал бесплатный Collage Maker. Если вам когда‑нибудь понадобится объединить JPG/JPEG или PNG‑изображения, создать сетку из фотографий, вы можете воспользоваться этим сервисом.Добавить изображение как ссылку
Чтобы избежать больших размеров презентаций, можно добавлять изображения (или видео) через ссылки вместо встраивания файлов непосредственно в презентацию. Этот код PHP показывает, как добавить изображение и видео в заполнитель:
$presentation = new Presentation("input.pptx");
try {
$shapesToRemove = new Java("java.util.ArrayList");
$shapesCount = $presentation->getSlides()->get_Item(0)->getShapes()->size();
for($i = 0; $i < java_values($shapesCount) ; $i++) {
$autoShape = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item($i);
if (java_is_null($autoShape->getPlaceholder())) {
continue;
}
switch ($autoShape->getPlaceholder()->getType()) {
case PlaceholderType::Picture :
$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 :
$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;
}
}
foreach($shapesToRemove as $shape) {
$presentation->getSlides()->get_Item(0)->getShapes()->remove($shape);
}
$presentation->save("output.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
Обрезка изображений
Этот код PHP показывает, как обрезать существующее изображение на слайде:
$pres = new Presentation();
# Создает новый объект изображения
try {
$picture;
$image = Images->fromFile($imagePath);
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
# Добавляет PictureFrame на слайд
$picFrame = $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 100, 100, 420, 250, $picture);
# Обрезает изображение (процентные значения)
$picFrame->getPictureFormat()->setCropLeft(23.6);
$picFrame->getPictureFormat()->setCropRight(21.5);
$picFrame->getPictureFormat()->setCropTop(3);
$picFrame->getPictureFormat()->setCropBottom(31);
# Сохраняет результат
$pres->save($outPptxFile, SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Удаление обрезанных областей изображения
Если нужно удалить обрезанные области изображения, содержащегося в рамке, можно использовать метод deletePictureCroppedAreas(). Этот метод возвращает обрезанное изображение или исходное, если обрезка не требуется.
Этот код PHP демонстрирует операцию:
$presentation = new Presentation("PictureFrameCrop.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
# Получает PictureFrame с первого слайда
$picFrame = $slide->getShapes()->get_Item(0);
# Удаляет обрезанные области изображения PictureFrame и возвращает обрезанное изображение
$croppedImage = $picFrame->getPictureFormat()->deletePictureCroppedAreas();
# Сохраняет результат
$presentation->save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
NOTE
Метод deletePictureCroppedAreas() добавляет обрезанное изображение в коллекцию изображений презентации. Если изображение используется только в обработанном PictureFrame, такая настройка может уменьшить размер презентации. В противном случае количество изображений в полученной презентации увеличится.
Этот метод конвертирует метафайлы WMF/EMF в растровое PNG‑изображение в процессе обрезки.
Блокировка соотношения сторон
Если требуется, чтобы фигура с изображением сохраняла своё соотношение сторон даже после изменения размеров изображения, можно использовать метод setAspectRatioLocked для установки параметра Lock Aspect Ratio.
Этот код PHP показывает, как заблокировать соотношение сторон фигуры:
$pres = new Presentation("pres.pptx");
try {
$layout = $pres->getLayoutSlides()->getByType(SlideLayoutType::Custom);
$emptySlide = $pres->getSlides()->addEmptySlide($layout);
$picture;
$image = Images->fromFile("image.png");
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
$pictureFrame = $emptySlide->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $presImage->getWidth(), $presImage->getHeight(), $picture);
# установить форму, чтобы сохранялось соотношение сторон при изменении размера
$pictureFrame->getPictureFrameLock()->setAspectRatioLocked(true);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
NOTE
Этот параметр Lock Aspect Ratio сохраняет только соотношение сторон фигуры, а не изображения, которое она содержит.Использование свойства StretchOff
С помощью методов setStretchOffsetLeft, setStretchOffsetTop, setStretchOffsetRight и setStretchOffsetBottom класса PictureFillFormat можно задать прямоугольник заполнения.
Когда для изображения указано растяжение, исходный прямоугольник масштабируется, чтобы соответствовать указанному прямоугольнику заполнения. Каждая грань прямоугольника заполнения задаётся процентным смещением от соответствующей грани ограничивающего прямоугольника фигуры. Положительный процент обозначает врезку, а отрицательный — выступ.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Добавьте прямоугольный
AutoShape. - Создайте изображение.
- Установите тип заполнения фигуры.
- Установите режим заполнения рисунком фигуры.
- Добавьте изображение для заполнения фигуры.
- Укажите смещения изображения от соответствующей грани ограничивающего прямоугольника фигуры.
- Запишите изменённую презентацию в файл PPTX.
Этот код PHP демонстрирует процесс, в котором используется свойство StretchOff:
# Создаёт экземпляр класса Presentation, представляющего файл PPTX
$pres = new Presentation();
try {
# Получает первый слайд
$slide = $pres->getSlides()->get_Item(0);
# Создаёт экземпляр класса ImageEx
$picture;
$image = Images->fromFile("aspose-logo.jpg");
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
# Добавляет AutoShape типа Rectangle
$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 (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
FAQ
Как узнать, какие форматы изображений поддерживаются для PictureFrame?
Aspose.Slides поддерживает как растровые изображения (PNG, JPEG, BMP, GIF и т.д.), так и векторные изображения (например, SVG) через объект изображения, назначенный PictureFrame. Список поддерживаемых форматов, как правило, совпадает с возможностями движка слайдов и конвертации изображений.
Как добавление множества больших изображений повлияет на размер PPTX и производительность?
Встраивание больших изображений увеличивает размер файла и потребление памяти; использование ссылок на изображения помогает уменьшить размер презентации, но требует доступности внешних файлов. Aspose.Slides предоставляет возможность добавлять изображения по ссылке для уменьшения размера файла.
Как заблокировать объект изображения от случайного перемещения/изменения размера?
Используйте [shape locks] для PictureFrame (например, отключить перемещение или изменение размера). Механизм блокировки поддерживается для различных типов фигур, включая PictureFrame.
Сохраняется ли векторная точность SVG при экспорте презентации в PDF/изображения?
Aspose.Slides позволяет извлечь SVG из PictureFrame как оригинальный вектор. При экспорте в PDF или растровые форматы результат может быть растровым в зависимости от настроек экспорта; факт того, что оригинальный SVG хранится как вектор, подтверждается поведением извлечения.