Управление рамками изображений в презентациях с использованием PHP
Рамка изображения — это форма, содержащая изображение; она похожа на картину в рамке.
Вы можете добавить изображение на слайд через рамку изображения. Таким образом, вы форматируете изображение, форматируя рамку изображения.
Tip
Aspose предоставляет бесплатные конвертеры — JPEG в PowerPoint и PNG в PowerPoint — которые позволяют быстро создавать презентации из изображений.Создать рамку изображения
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Создайте объект IPPImage путем добавления изображения в IImagescollection, связанный с объектом презентации, который будет использоваться для заполнения формы.
- Укажите ширину и высоту изображения.
- Создайте 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.
- Получите ссылку на слайд по его индексу.
- Добавьте изображение в коллекцию изображений презентации.
- Создайте объект IPPImage путем добавления изображения в IImagescollection, связанный с объектом презентации, который будет использоваться для заполнения формы.
- Укажите относительную ширину и высоту изображения в рамке изображения.
- Сохраните изменённую презентацию в файл 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.
- Получите ссылку на слайд по его индексу.
- Создайте объект IPPImage путем добавления изображения в IImagescollection, связанный с объектом презентации, который будет использоваться для заполнения формы.
- Укажите ширину и высоту изображения.
- Создайте
PictureFrameна основе ширины и высоты изображения через метод AddPictureFrame , предоставляемый объектом IShapes. - Добавьте рамку изображения (содержащую картинку) на слайд.
- Установите цвет линии рамки изображения.
- Установите ширину линии рамки изображения.
- Поверните рамку изображения, задав ей положительное или отрицательное значение.
- Положительное значение вращает изображение по часовой стрелке.
- Отрицательное значение вращает изображение против часовой стрелки.
- Добавьте рамку изображения (содержащую картинку) на слайд.
- Сохраните изменённую презентацию в файл 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();
}
}
# Добавляет рамку изображения на слайд
$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
Используя свойства StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight и StretchOffsetBottom из интерфейса [IPictureFillFormat] и класса [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 хранится как вектор, подтверждается поведением извлечения.