在 Android 上管理演示文稿中的图片框

图片框是一种包含图像的形状——它就像装在框中的图片。

您可以通过图片框向幻灯片添加图像。这样,您可以通过格式化图片框来格式化图像。

Create a Picture Frame

  1. 创建一个 Presentation 类的实例。
  2. 通过索引获取幻灯片的引用。
  3. 通过向与演示文稿对象关联的 IImagescollection 添加图像来创建一个 IPPImage 对象,用于填充形状。
  4. 指定图像的宽度和高度。
  5. 通过引用幻灯片关联的形状对象公开的 AddPictureFrame 方法,基于图像的宽度和高度创建一个 PictureFrame
  6. 将包含图片的图片框添加到幻灯片中。
  7. 将修改后的演示文稿写入为 PPTX 文件。

下面的 Java 代码示例展示了如何创建图片框:

// 实例化表示 PPTX 文件的 Presentation 类
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();
}

Create a Picture Frame with Relative Scale

通过更改图像的相对缩放,可以创建更复杂的图片框。

  1. 创建一个 Presentation 类的实例。
  2. 通过索引获取幻灯片的引用。
  3. 向演示文稿的图像集合中添加图像。
  4. 通过向与演示文稿对象关联的 IImagescollection 添加图像来创建一个 IPPImage 对象,用于填充形状。
  5. 在图片框中指定图像的相对宽度和高度。
  6. 将修改后的演示文稿写入为 PPTX 文件。

下面的 Java 代码示例展示了如何创建具有相对比例的图片框:

// 实例化表示 PPTX 的 Presentation 类
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();
}

Extract Raster Images from Picture Frames

您可以从 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();
}

Extract SVG Images from Picture Frames

当演示文稿在 PictureFrame 形状中包含 SVG 图形时,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();
}

Get Transparency of an Image

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);
    }
}

Picture Frame Formatting

Aspose.Slides 提供了许多可应用于图片框的格式化选项。使用这些选项,您可以更改图片框以满足特定需求。

  1. 创建一个 Presentation 类的实例。
  2. 通过索引获取幻灯片的引用。
  3. 通过向与演示文稿对象关联的 IImagescollection 添加图像来创建一个 IPPImage 对象,用于填充形状。
  4. 指定图像的宽度和高度。
  5. 通过 IShapeCollection 对象公开的 AddPictureFrame 方法,基于图像的宽度和高度创建一个 PictureFrame
  6. 将包含图片的图片框添加到幻灯片中。
  7. 设置图片框的线条颜色。
  8. 设置图片框的线条宽度。
  9. 通过正值或负值旋转图片框。
    • 正值顺时针旋转图像。
    • 负值逆时针旋转图像。
  10. 再次将图片框(包含图片)添加到幻灯片中。
  11. 将修改后的演示文稿写入为 PPTX 文件。

下面的 Java 代码演示了图片框的格式化过程:

// 实例化表示 PPTX 的 Presentation 类
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();
}

为了避免演示文稿体积过大,您可以通过链接添加图像(或视频),而不是将文件直接嵌入到演示文稿中。以下 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();
}

Crop Images

下面的 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();
}

Delete Cropped Areas of a Picture

如果您想删除框中图像的裁剪区域,可使用 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();
}

Lock Aspect Ratio

如果您希望包含图像的形状在更改图像尺寸后仍保持其宽高比,可以使用 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();
}

Use the StretchOff Property

使用 StretchOffsetLeftStretchOffsetTopStretchOffsetRightStretchOffsetBottom 属性(来自 IPictureFillFormat 接口和 PictureFillFormat 类),您可以指定填充矩形。

当为图像指定伸展时,源矩形会按比例缩放以适应指定的填充矩形。每条填充矩形的边缘由相对于形状边界框对应边缘的百分比偏移量定义。正百分比表示内缩,负百分比表示外伸。

  1. 创建一个 Presentation 类的实例。
  2. 通过索引获取幻灯片的引用。
  3. 添加一个矩形 AutoShape
  4. 创建图像。
  5. 设置形状的填充类型。
  6. 设置形状的图片填充模式。
  7. 添加用于填充形状的图像。
  8. 指定图像相对于形状边界框对应边缘的偏移量。
  9. 将修改后的演示文稿写入为 PPTX 文件。

下面的 Java 代码演示了使用 StretchOff 属性的流程:

// 实例化表示 PPTX 文件的 Presentation 类
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
    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 通过分配给 PictureFrame 的图像对象支持光栅图像(PNG、JPEG、BMP、GIF 等)和矢量图像(例如 SVG)。支持的格式列表通常与幻灯片和图像转换引擎的能力重叠。

在 PPTX 中添加大量大图像会如何影响文件大小和性能?
嵌入大图像会增加文件大小和内存消耗;通过链接添加图像可保持演示文稿体积较小,但需确保外部文件始终可访问。Aspose.Slides 提供通过链接添加图像的功能,以降低文件大小。

如何防止图像对象意外移动/调整大小?
可对 PictureFrame 使用 shape locks(例如禁用移动或调整大小)。锁定机制支持多种形状类型,包括 PictureFrame

导出演示文稿为 PDF/图像时,SVG 矢量的保真度是否得到保留?
Aspose.Slides 允许从 PictureFrame 中提取原始矢量 SVG。导出为 PDF(export to PDF)或光栅格式(export to PNG)时,结果可能会根据导出设置进行光栅化;提取行为确认原始 SVG 仍以矢量形式存储。