Java を使用したプレゼンテーションにおける画像管理の最適化

プレゼンテーション スライドの画像

画像はプレゼンテーションをより魅力的で面白くします。Microsoft PowerPoint では、ファイル、インターネット、その他の場所から画像をスライドに挿入できます。同様に、Aspose.Slides では、さまざまな方法でプレゼンテーションのスライドに画像を追加できます。

Aspose.Slides は、JPEG、PNG、GIF などの一般的な形式の画像操作をサポートしています。

ローカルに保存された画像をスライドに追加

コンピューター上の画像を 1 枚または複数枚、プレゼンテーションのスライドに追加できます。この Java サンプルコードは、画像をスライドに追加する方法を示しています:

Presentation pres = new Presentation();
try {
	ISlide slide = pres.getSlides().get_Item(0);
	    IPPImage picture;
        IImage image = Images.fromFile("image.png");
        try {
            picture = pres.getImages().addImage(image);
        } finally {
            if (image != null) image.dispose();
        }
	slide.getShapes().addPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, picture);

	pres.save("pres.pptx", SaveFormat.Pptx);
} finally {
	if (pres != null) pres.dispose();
}

Web からの画像をスライドに追加

スライドに追加したい画像がコンピューターにない場合、Web から直接画像を追加できます。

このサンプルコードは、Java で Web から画像をスライドに追加する方法を示しています:

Presentation pres = new Presentation();
try {
	ISlide slide = pres.getSlides().get_Item(0);

	URL imageUrl = new URL("[REPLACE WITH URL]");
	URLConnection connection = imageUrl.openConnection();
	InputStream inputStream = connection.getInputStream();

	ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
	try {
		byte[] buffer = new byte[1024];
		int read;

		while ((read = inputStream.read(buffer, 0, buffer.length)) != -1)
			outputStream.write(buffer, 0, read);

		outputStream.flush();

		IPPImage image = pres.getImages().addImage(outputStream.toByteArray());
		slide.getShapes().addPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, image);
	} finally {
		if (inputStream != null) inputStream.close();
		outputStream.close();
	}

	pres.save("pres.pptx", SaveFormat.Pptx);
} catch(IOException e) {
} finally {
	if (pres != null) pres.dispose();
}

スライドマスターに画像を追加

スライドマスターは、下位のすべてのスライドに関する情報(テーマ、レイアウトなど)を保存および管理する最上位のスライドです。そのため、スライドマスターに画像を追加すると、その画像はそのマスター配下のすべてのスライドに表示されます。

この Java サンプルコードは、スライドマスターに画像を追加する方法を示しています:

Presentation pres = new Presentation();
try {
	ISlide slide = pres.getSlides().get_Item(0);
	IMasterSlide masterSlide = slide.getLayoutSlide().getMasterSlide();

    IPPImage picture;
    IImage image = Images.fromFile("image.png");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }
	masterSlide.getShapes().addPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, picture);

	pres.save("pres.pptx", SaveFormat.Pptx);
} finally {
	if (pres != null) pres.dispose();
}

画像をスライドの背景として追加

特定のスライドや複数のスライドの背景として画像を使用したい場合があります。その際は、Setting Images as Backgrounds for Slides を参照してください。

SVG をプレゼンテーションに追加

任意の画像をプレゼンテーションに追加または挿入するには、[IShapeCollection] インターフェイスに属する addPictureFrame メソッドを使用できます。

SVG 画像に基づく画像オブジェクトを作成するには、以下の手順で行います:

  1. SvgImage オブジェクトを作成して ImageShapeCollection に挿入する
  2. ISvgImage から PPImage オブジェクトを作成する
  3. IPPImage インターフェイスを使用して PictureFrame オブジェクトを作成する

このサンプルコードは、上記の手順を実装して SVG 画像をプレゼンテーションに追加する方法を示しています:

// PPTX ファイルを表す Presentation クラスをインスタンス化
Presentation pres = new Presentation();
try {
    String svgContent = new String(Files.readAllBytes(Paths.get("image.svg")));
    ISvgImage svgImage = new SvgImage(svgContent);
    IPPImage ppImage = pres.getImages().addImage(svgImage);
    pres.getSlides().get_Item(0).getShapes().addPictureFrame(ShapeType.Rectangle, 0, 0, 
            ppImage.getWidth(), ppImage.getHeight(), ppImage);
    pres.save("output.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

SVG をシェイプのセットに変換

Aspose.Slides の SVG をシェイプのセットに変換する機能は、SVG 画像を扱う PowerPoint の機能と同様です。

PowerPoint Popup Menu

この機能は、[IShapeCollection] インターフェイスの addGroupShape メソッドのオーバーロードの一つで提供され、最初の引数に [ISvgImage] オブジェクトを取ります。

このサンプルコードは、記述されたメソッドを使用して SVG ファイルをシェイプのセットに変換する方法を示しています:

// 新しいプレゼンテーションを作成
IPresentation presentation = new Presentation();
try {
    // SVG ファイルの内容を読み込む
    byte[] svgContent = Files.readAllBytes(Paths.get("image.svg"));

    // SvgImage オブジェクトを作成
    ISvgImage svgImage = new SvgImage(svgContent);

    // スライドのサイズを取得
    Dimension2D slideSize = presentation.getSlideSize().getSize();

    // SVG 画像をスライドサイズに合わせてスケーリングし、シェイプのグループに変換
    presentation.getSlides().get_Item(0).getShapes().
            addGroupShape(svgImage, 0f, 0f, (float)slideSize.getWidth(), (float)slideSize.getHeight());

    // プレゼンテーションを PPTX 形式で保存
    presentation.save("output.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (presentation != null) presentation.dispose();
}

画像を EMF としてスライドに追加

Aspose.Slides for Java を使用すると、Excel シートから EMF 画像を生成し、Aspose.Cells と組み合わせてスライドに EMF として画像を追加できます。

このサンプルコードは、記述されたタスクを実行する方法を示しています:

Workbook book = new Workbook("chart.xlsx");
Worksheet sheet = book.getWorksheets().get(0);
ImageOrPrintOptions options = new ImageOrPrintOptions();
options.setHorizontalResolution(200);
options.setVerticalResolution(200);
options.setImageType(ImageType.EMF);

//ワークブックをストリームに保存
SheetRender sr = new SheetRender(sheet, options);
Presentation pres = new Presentation();
try {
    pres.getSlides().removeAt(0);
    
    String EmfSheetName = "";
    for (int j = 0; j < sr.getPageCount(); j++)
    {
    
        EmfSheetName = "test" + sheet.getName() + " Page" + (j + 1) + ".out.emf";
        sr.toImage(j, EmfSheetName);

        IPPImage picture;
        IImage image = Images.fromFile(EmfSheetName);
        try {
            picture = pres.getImages().addImage(image);
        } finally {
            if (image != null) image.dispose();
        }
        ISlide slide = pres.getSlides().addEmptySlide(pres.getLayoutSlides().getByType(SlideLayoutType.Blank));
        IShape m = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 0, 0,
					(float)pres.getSlideSize().getSize().getWidth(), 
					(float)pres.getSlideSize().getSize().getHeight(), 
					picture);
    }
    
    pres.save("output.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

イメージコレクション内の画像を置換

Aspose.Slides を使用すると、プレゼンテーションのイメージコレクションに格納されている画像(スライドシェイプで使用されているものを含む)を置換できます。このセクションでは、コレクション内の画像を更新するいくつかの方法を示します。API には、生バイトデータ、[IImage] インスタンス、またはコレクション内に既に存在する別の画像を使用して画像を置換するシンプルなメソッドが用意されています。

  1. 画像を含むプレゼンテーション ファイルを Presentation クラスでロードします。
  2. ファイルから新しい画像をバイト配列にロードします。
  3. バイト配列を使用して対象画像を新しい画像に置換します。
  4. 2 番目の方法では、画像を IImage オブジェクトにロードし、そのオブジェクトで対象画像を置換します。
  5. 3 番目の方法では、プレゼンテーションのイメージコレクションに既に存在する画像で対象画像を置換します。
  6. 修正したプレゼンテーションを PPTX ファイルとして書き出します。
// プレゼンテーション ファイルを表す Presentation クラスをインスタンス化します。
Presentation presentation = new Presentation("sample.pptx");
try {
    // 最初の方法。
    byte[] imageData = Files.readAllBytes(Paths.get("image0.jpeg"));
    IPPImage oldImage = presentation.getImages().get_Item(0);
    oldImage.replaceImage(imageData);
    
    // 2 番目の方法。
    IImage newImage = Images.fromFile("image1.png");
    oldImage = presentation.getImages().get_Item(1);
    oldImage.replaceImage(newImage);
    newImage.dispose();
    
    // 3 番目の方法。
    oldImage = presentation.getImages().get_Item(2);
    oldImage.replaceImage(presentation.getImages().get_Item(3));
    
    // プレゼンテーションをファイルに保存します。
    presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

FAQ

挿入後も元の画像解像度はそのままですか?

はい。元のピクセルは保持されますが、最終的な見た目はスライド上で picture がどのようにスケーリングされるか、保存時に適用される圧縮に依存します。

多数のスライドで同じロゴを一括置換する最適な方法は何ですか?

ロゴをマスタースライドまたはレイアウトに配置し、プレゼンテーションのイメージコレクションで置換します。更新はそのリソースを使用しているすべての要素に伝播します。

挿入した SVG を編集可能なシェイプに変換できますか?

はい。SVG をシェイプのグループに変換でき、その後個々のパーツは標準のシェイププロパティで編集可能になります。

複数のスライドの背景として画像を一括設定するにはどうすればよいですか?

マスタースライドまたは該当レイアウトで画像を背景として割り当てます(Assign the image as the background)。そのマスタ/レイアウトを使用しているスライドはすべて背景を継承します。

多数の画像でプレゼンテーションのサイズが膨らむのを防ぐには?

画像の重複を避けて単一のリソースを再利用し、適切な解像度を選択し、保存時に圧縮を適用し、必要に応じてマスターに繰り返し使用するグラフィックを配置します。