System.Drawing.Bitmapを使い続ける?クロスプラットフォームとサーバーサイドにおける画像処理ライブラリ

.NETアプリケーションで画像処理を行う場合、多くの開発者は .NET Frameworkの時代から長期にわたってSystem.Drawing.Bitmapを利用してきました。しかし、Windows環境以外にもLinuxやmacOSといったクロスプラットフォームなOS環境やAzureやAWSといったクラウドサービスで .NETアプリケーションを動作させるケースが増えてきている現在、System.Drawing.Bitmapは以前のように推奨される選択肢ではなくなっています。

本記事では、System.Drawing.Bitmapを利用し続けるリスクと、移行先の画像処理ライブラリとして「DioDocs for Imaging」を紹介します。

なぜSystem.Drawing.Bitmapが推奨されないのか?

Microsoftでは、.NET 6からSystem.Drawing.Bitmapが含まれるSystem.Drawing.CommonパッケージをWindows専用のパッケージとして扱うとアナウンスしています。Windows以外の環境でSystem.Drawing.Bitmapを利用した場合には、コンパイル時には警告が表示され、実行時にはPlatformNotSupportedExceptionが発生するようになっています。

この変更の背景にはSystem.Drawing.Commonが内部的に利用しているライブラリlibgdiplusの存在があります。System.Drawing.Commonのクロスプラットフォーム実装を支えていたlibgdiplusは、上記リンク先のページに記載があるように品質や保守性などの面で課題を抱えていました。

そのため、MicrosoftではSystem.Drawing.CommonをWindows環境に特化して開発を進めていく方針をアナウンスしていて、クロスプラットフォームでの画像処理には他のライブラリを使用することを推奨しています。

System.Drawing.Bitmapからの移行先をどうするか?

System.Drawing.Bitmapを利用した画像処理は、単なる画像の読み込みや保存だけではありません。多くの業務システムでは次のような処理が実装されています。

  • 画像の切り抜き
  • 画像の拡大・縮小
  • 画像の回転・反転
  • 画像の合成・結合
  • 画像の色調補正
  • テキストや図形、ウォーターマークなどの追加
  • 画像フォーマットの変換

これらの機能のほかに、Windows以外のOS環境であるLinuxやmacOSで動作すること、AzureやAWSといったクラウド環境でも動作することが代替となるライブラリには求められることになります。

DioDocs for Imagingという選択肢

DioDocs for Imagingは、.NETアプリケーション開発向けの画像処理ライブラリです。従来の .NET Frameworkから .NETまで対応しており、WindowsだけでなくLinuxやmacOSでも動作します。さらにAzure、AWS、Google Cloudなどのクラウド環境での動作にも対応しています。

以下はSystem.Drawing.BitmapからDioDocs for Imagingに移行した場合のコードの一例です。ほぼ同じようなコードで処理を実装することが可能です。

System.Drawing.Bitmap

using System.Drawing;
using System.Drawing.Imaging;

// 画像を読み込み
using (Bitmap bmp = new Bitmap("test.jpg"))
{
    // 切り抜く範囲を指定
    Rectangle rect = new Rectangle(200, 200, bmp.Width - 200 * 2, bmp.Height - 200 * 2);

    // 切り抜いた画像を保存
    using (Bitmap cropBmp = bmp.Clone(rect, bmp.PixelFormat))
    {
        cropBmp.Save("crop.jpg", ImageFormat.Jpeg);
    }
}

DioDocs for Imaging

using System.Drawing;
using GrapeCity.Documents.Imaging;

// 画像を読み込み
// DioDocs for Imaging の Bitmap クラスを使用
using (GcBitmap bmp = new GcBitmap("test.jpg"))
{
    // 切り抜く範囲を指定
    Rectangle rect = new Rectangle(200, 200, (int)(bmp.Width - 200 * 2), (int)(bmp.Height - 200 * 2));

    // 切り抜いた画像を保存し
    // ※ DioDocs for ImagingのClipメソッドで切り抜き、SaveAsJpegメソッドで保存
    using (GcBitmap cropBmp = bmp.Clip(rect))
    {
        cropBmp.SaveAsJpeg("crop.jpg");
    }
}

また、System.Drawing.Bitmapの代替となるライブラリとしてOSSライブラリも選択肢になるかと思いますが、業務システムにおいては

  • 長期的なサポート
  • 日本語ドキュメント
  • 日本語サポート
  • 継続的なアップデート、不具合の修正

を重視するケースも少なくありません。DioDocs for Imagingは、そのようなエンタープライズな要件にも対応できる商用ライブラリとして、.NETアプリケーション開発でご利用いただけます。

また、画像処理を行うAPIライブラリに加えて、ブラウザ上で画像を表示・編集できるJavaScriptベースのImageビューワも提供しています。クライアントサイドでのリサイズ、切り抜き、反転・回転、色・輝度・コントラスト調整、フィルタの適用、テキストやフリーハンド描画などが可能です。

まとめ

System.Drawing.Bitmapを含むSystem.Drawing.Common は、本記事で取り上げたように .NET 6以降はWindows専用のパッケージとなっており、Windows以外の環境での利用は非推奨とされています。AWS LambdaCloud Run functionsといったクラウドサービスではWindowsがサポートされていないので、よりSystem.Drawing.Bitmapからの移行を検討する必要性が高まります。

DioDocs for Imagingは、長期的な保守性とサポート体制を重視するプロジェクトにとって有力な移行先となるかと思います。興味のある方は、まずは無料トライアルやデモアプリケーションで、実際の動作を確認してみることをおすすめします。

また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問についてもお気軽にお問合せください。

\  この記事をシェアする  /