モダン API で画像処理を強化する

はじめに

歴史的に、Aspose Slides は System.Drawing に依存しており、パブリック API で以下のクラスを使用していました。

バージョン 24.4 以降、これらのパブリック API は非推奨と宣言されています。

.NET6 以降のバージョンでの System.Drawing のサポートが Windows 以外の環境で削除されたため(breaking change)、Slides は 2 つのパッケージ方式を実装しました。

Aspose.Slides.NET6.CrossPlatform の不便な点は、同じ名前空間に独自の System.Drawing 実装を持ち、パブリック API との下位互換性を保っていることです。そのため、Aspose.Slides.NET6.CrossPlatform と .NET Framework の System.Drawing、または System.Drawing.Common パッケージを同時に使用すると、エイリアスを使用しない限り名前の衝突が発生します。

メインの Aspose.Slides.NET パッケージから System.Drawing への依存を排除するために、いわゆる「モダン API」を追加しました。つまり、非推奨となった API の代わりに使用すべき API で、シグネチャには System.Drawing の ImageBitmap に対する依存が含まれます。PrinterSettingsGraphics は非推奨と宣言され、パブリック Slides API からは削除されました。

現在のバージョンでは、System.Drawing に依存するパブリック API をレガシー/非推奨として扱います。新しいコードや既存の画像処理ワークフローの移行にはモダン API を使用してください。

モダン API

パブリック API に以下のクラスと列挙型を追加しました。

IImage は disposable であり(IDisposable インターフェイスを実装)、使用時は using ブロックでラップするか、適切な方法で破棄してください。

GetImage を使用して単一スライドまたはシェイプをレンダリングします。GetImages を使用して複数のプレゼンテーションスライドをレンダリングします。Images のメソッドで画像を読み込み、AddImageIImage を渡してプレゼンテーションに追加し、ReplaceImageIImage を渡して既存の画像を更新します。

新しい API の典型的な使用シナリオは次のようになります。

using (Presentation pres = new Presentation())
{
    IPPImage ppImage;
    // ディスク上のファイルから IImage の破棄可能インスタンスを生成します。
    using (IImage image = Images.FromFile("image.png"))
    {
        // IImage のインスタンスをプレゼンテーションの画像に追加して PowerPoint 画像を作成します。
        ppImage = pres.Images.AddImage(image);
    }

    // スライド #1 に画像シェイプを追加します
    pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);

    // スライド #1 を表す IImage のインスタンスを取得します。
    using (var slideImage = pres.Slides[0].GetImage(new Size(1920, 1080)))
    {
        // 画像をディスクに保存します。
        slideImage.Save("slide1.jpeg", ImageFormat.Jpeg);
    }
}

旧コードをモダン API に置き換える

移行を容易にするために、新しい IImage のインターフェイスは、ImageBitmap クラスの個別シグネチャを繰り返しています。基本的には、System.Drawing を使用した旧メソッド呼び出しを新しいものに置き換えるだけです。

スライドのサムネイル取得

レガシー/非推奨 API:

using (Presentation pres = new Presentation("pres.pptx"))
{
    pres.Slides[0].GetThumbnail().Save("slide1.png");
}

モダン API:

using (Presentation pres = new Presentation("pres.pptx"))
{
    pres.Slides[0].GetImage().Save("slide1.png");
}

シェイプのサムネイル取得

レガシー/非推奨 API:

using (Presentation pres = new Presentation("pres.pptx"))
{
    pres.Slides[0].Shapes[0].GetThumbnail().Save("shape.png");
}

モダン API:

using (Presentation pres = new Presentation("pres.pptx"))
{
    pres.Slides[0].Shapes[0].GetImage().Save("shape.png");
}

プレゼンテーションのサムネイル取得

レガシー/非推奨 API:

using (Presentation pres = new Presentation("pres.pptx"))
{
    var bitmaps = pres.GetThumbnails(new RenderingOptions(), new Size(1980, 1028));
    try
    {
        for (var index = 0; index < bitmaps.Length; index++)
        {
            Bitmap thumbnail = bitmaps[index];
            thumbnail.Save($"slide{index}.png", ImageFormat.Png);
        }
    }
    finally
    {
        foreach (Bitmap bitmap in bitmaps)
        {
            bitmap.Dispose();
        }
    }
}

モダン API:

using (Presentation pres = new Presentation("pres.pptx"))
{
    var images = pres.GetImages(new RenderingOptions(), new Size(1980, 1028));
    try
    {
        for (var index = 0; index < images.Length; index++)
        {
            IImage thumbnail = images[index];
            thumbnail.Save($"slide{index}.png", ImageFormat.Png);
        }
    }
    finally
    {
        foreach (IImage image in images)
        {
            image.Dispose();
        }
    }
}

プレゼンテーションへの画像追加

レガシー/非推奨 API:

using (Presentation pres = new Presentation())
{
    IPPImage ppImage;
    using (Image image = Image.FromFile("image.png"))
    {
        ppImage = pres.Images.AddImage(image);
    }

    pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
}

モダン API:

using (Presentation pres = new Presentation())
{
    IPPImage ppImage;
    using (IImage image = Aspose.Slides.Images.FromFile("image.png"))
    {
        ppImage = pres.Images.AddImage(image);
    }

    pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
}

非推奨メソッド/プロパティとモダン API における置換

Presentation

メソッド シグネチャ 置換メソッド シグネチャ
public Bitmap[] GetThumbnails(IRenderingOptions options) GetImages(IRenderingOptions options)
public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides) GetImages(IRenderingOptions options, int[] slides)
public Bitmap[] GetThumbnails(IRenderingOptions options, float scaleX, float scaleY) GetImages(IRenderingOptions options, float scaleX, float scaleY)
public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides, float scaleX, float scaleY) GetImages(IRenderingOptions options, int[] slides, float scaleX, float scaleY)
public Bitmap[] GetThumbnails(IRenderingOptions options, Size imageSize) GetImages(IRenderingOptions options, Size imageSize)
public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides, Size imageSize) GetImages(IRenderingOptions options, int[] slides, Size imageSize)
public void Save(string fname, SaveFormat format, HttpResponse response, bool showInline) No Modern API replacement
public void Save(string fname, SaveFormat format, ISaveOptions options, HttpResponse response, bool showInline) No Modern API replacement
public void Print() No Modern API replacement
public void Print(PrinterSettings printerSettings) No Modern API replacement
public void Print(string printerName) No Modern API replacement
public void Print(PrinterSettings printerSettings, string presName) No Modern API replacement

Shape

メソッド シグネチャ 置換メソッド シグネチャ
public Bitmap GetThumbnail() GetImage
public Bitmap GetThumbnail(ShapeThumbnailBounds bounds, float scaleX, float scaleY) GetImage(ShapeThumbnailBounds bounds, float scaleX, float scaleY)

Slide

メソッド シグネチャ 置換メソッド シグネチャ
public Bitmap GetThumbnail(float scaleX, float scaleY) GetImage(float scaleX, float scaleY)
public Bitmap GetThumbnail() GetImage
public Bitmap GetThumbnail(IRenderingOptions options) GetImage(IRenderingOptions options)
public Bitmap GetThumbnail(Size imageSize) GetImage(Size imageSize)
public Bitmap GetThumbnail(ITiffOptions options) GetImage(ITiffOptions options)
public Bitmap GetThumbnail(IRenderingOptions options, float scaleX, float scaleY) GetImage(IRenderingOptions options, float scaleX, float scaleY)
public Bitmap GetThumbnail(IRenderingOptions options, Size imageSize) GetImage(IRenderingOptions options, Size imageSize)
public void RenderToGraphics(IRenderingOptions options, Graphics graphics) No Modern API replacement
public void RenderToGraphics(IRenderingOptions options, Graphics graphics, float scaleX, float scaleY) No Modern API replacement
public void RenderToGraphics(IRenderingOptions options, Graphics graphics, Size renderingSize) No Modern API replacement

Output

メソッド シグネチャ 置換メソッド シグネチャ
public IOutputFile Add(string path, Image image) Add(string path, IImage image)

ImageCollection

メソッド シグネチャ 置換メソッド シグネチャ
IPPImage AddImage(Image image) AddImage(IImage image)

ImageWrapperFactory

メソッド シグネチャ 置換メソッド シグネチャ
IImageWrapper CreateImageWrapper(Image image) CreateImageWrapper(IImage image)

PPImage

メソッド/プロパティ シグネチャ 置換メソッド シグネチャ
void ReplaceImage(Image newImage) ReplaceImage(IImage newImage)
Image SystemImage { get; } IImage Image { get; }

PatternFormat

メソッド シグネチャ 置換メソッド シグネチャ
Bitmap GetTileImage(Color background, Color foreground) GetTile(Color background, Color foreground)
Bitmap GetTileImage(Color styleColor) GetTile(Color styleColor)

IPatternFormatEffectiveData

メソッド シグネチャ 置換メソッド シグネチャ
Bitmap GetTileImage(Color background, Color foreground) GetTileIImage(SlidesImage image)

Graphics と PrinterSettings 用 API のサポート

Graphics クラスは .NET6 以降のクロスプラットフォーム バージョンではサポートされていません。Aspose Slides では、Graphics へのレンダリング API の代わりにモダン API の画像レンダリングメソッドを使用してください。 ISlide

また、PrinterSettings を使用した印刷関連 API には直接的なモダン API の置換はありません。

IPresentation:

FAQ

なぜ Graphics が廃止されたのですか?

Graphics のサポートは、レンダリングと画像処理を統一し、プラットフォーム固有の依存関係を排除し、IImage を使用したクロスプラットフォーム アプローチに切り替えるために、パブリック API で非推奨となりました。GetImage または GetImages を使用して、Graphics へのレンダリングを置き換えてください。

IImageImage / Bitmap と比べて実務上の利点は何ですか?

IImage はラスタとベクタの両方の画像を統一的に扱い、ImageFormat を通じた多様な形式への保存を簡素化し、System.Drawing への依存を減らすことで、環境間でのコードの移植性を向上させます。

モダン API に切り替えるとサムネイル生成のパフォーマンスに影響がありますか?

GetThumbnail から GetImage への切り替えは、性能を悪化させることはありません。新しいメソッドはオプションやサイズ指定を伴う画像生成に同等の機能を提供します。具体的な性能向上または低下はシナリオに依存しますが、機能的には置換は等価です。