Извлечение изображений из фигур презентации
Извлечение изображений из фигур
Изображения часто добавляются в фигуры и также часто используются в качестве фона слайдов. Объекты изображения добавляются через IImageCollection, который представляет собой коллекцию объектов IPPImage.
В этой статье объясняется, как извлечь изображения, добавленные в презентацию.
Чтобы извлечь изображение из презентации, необходимо сначала найти его, пройдя по каждому слайду, а затем по каждой фигуре. Как только изображение найдено или идентифицировано, его можно извлечь и сохранить как новый файл.
public void extractImages()
{
Presentation pres = new Presentation(folderPath + "ExtractImages.pptx");
com.aspose.slides.IPPImage img = null;
com.aspose.slides.IPPImage backImage = null;
int slideIndex = 0;
String imageType = "";
boolean ifImageFound = false;
for (int i = 0; i < pres.getSlides().size(); i++)
{
slideIndex++;
//Получает первый слайд
ISlide sl = pres.getSlides().get_Item(i);
//Получает первый слайд Slide sl = pres.getSlideByPosition(i);
if (sl.getBackground().getFillFormat().getFillType() == FillType.Picture)
{
//Получает фоновое изображение
backImage = sl.getBackground().getFillFormat().getPictureFillFormat().getPicture().getImage();
imageType = getImageTType(backImage);
String imagePath = folderPath + "backImage_" + "Slide_" + slideIndex + "." + imageType;
//Сохраняет изображение
backImage.getImage().save(imagePath, (int) ImageFormat.getValue(ImageFormat.class, capitalize(imageType)));
} else
{
if (sl.getLayoutSlide().getBackground().getFillFormat().getFillType() == FillType.Picture)
{
//Получает фоновое изображение
backImage = sl.getLayoutSlide().getBackground().getFillFormat().getPictureFillFormat().getPicture().getImage();
imageType = getImageTType(backImage);
String imagePath = folderPath + "backImage_" + "LayoutSlide_" + slideIndex + "." + imageType;
//Сохраняет изображение
backImage.getImage().save(imagePath, (int) ImageFormat.getValue(ImageFormat.class, capitalize(imageType)));
}
}
for (int j = 0; j < sl.getShapes().size(); j++)
{
// Получает форму, содержащую изображение
IShape sh = sl.getShapes().get_Item(j);
if (sh instanceof IAutoShape)
{
IAutoShape ashp = (IAutoShape) sh;
if (ashp.getFillFormat().getFillType() == FillType.Picture)
{
img = ashp.getFillFormat().getPictureFillFormat().getPicture().getImage();
imageType = getImageTType(img);
ifImageFound = true;
}
} else if (sh instanceof IPictureFrame)
{
IPictureFrame pf = (IPictureFrame) sh;
img = pf.getPictureFormat().getPicture().getImage();
imageType = getImageTType(img);
ifImageFound = true;
}
//Устанавливает предпочтительный формат изображения
if (ifImageFound)
{
String imagePath = folderPath + "backImage_" + "Slide_" + slideIndex + "_Shape_" + j + "." + imageType;
//Сохраняет изображение
img.getImage().save(imagePath, (int) ImageFormat.getValue(ImageFormat.class, capitalize(imageType)));
}
ifImageFound = false;
}
}
}
private String getImageTType(IPPImage image)
{
String imageContentType = image.getContentType();
imageContentType = imageContentType.substring(imageContentType.indexOf("/") + 1);
imageContentType = imageContentType.substring(imageContentType.indexOf("-") + 1);
return imageContentType;
}
private String capitalize(String str)
{
if (str == null || str.length() <= 1) return str;
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
Вопросы и ответы
Могу ли я извлечь оригинальное изображение без обрезки, эффектов или трансформаций фигуры?
Да. При доступе к изображению фигуры вы получаете объект изображения из коллекции изображений презентации, то есть оригинальные пиксели без обрезки или стилизации. Рабочий процесс проходит через коллекцию изображений презентации и объекты PPImage, которые хранят необработанные данные.
Существует ли риск дублирования одинаковых файлов при одновременном сохранении множества изображений?
Да, если сохранять всё без разбора. Коллекция изображений презентации может содержать одинаковые двоичные данные, на которые ссылаются разные фигуры или слайды. Чтобы избежать дубликатов, сравнивайте хэши, размеры или содержимое извлечённых данных перед записью.
Как определить, какие фигуры связаны с конкретным изображением из коллекции презентации?
Aspose.Slides не хранит обратные ссылки от PPImage к фигурам. Постройте отображение вручную во время обхода: каждый раз, когда находите ссылку на PPImage, фиксируйте, какие фигуры её используют.
Могу ли я извлечь изображения, встроенные в объекты OLE, такие как прикрепленные документы?
Не напрямую, потому что объект OLE является контейнером. Нужно извлечь сам пакет OLE, а затем проанализировать его содержимое с помощью отдельных инструментов. Фигуры изображений презентации работают через PPImage; OLE — это другой тип объекта.