System.Drawing.Common の代替として Microsoft.Maui.Graphics を Linux で利用する

2023/08/20
★★★

System.Drawing.Common が Windows 固有のライブラリに

.NET 6 での breaking change(破壊的変更) で、System.Drawing.Common が、Windows 固有のライブラリと位置付けられました。Windows 以外の OS では、デフォルトの設定では、動作しなくなりました。ただし、ランタイム構成を変更すれば、動作するようです。

.NET 7 では、windows 以外のサポートが完全に廃止されています。.NET 6 のサポート終了は、2024 年 11 月 12 日 なので、Windows 以外の環境で、System.Drawing.Common を使用している場合は、それまでに移行が必要となります。Windows のみで利用している場合は、問題ありません。

WSL や Azure App Service on Linux で動作するアプリケーションで、System.Drawing.Common を利用している場合は、移行が必要となります。

System.Drawing.Common の代替

System.Drawing.Common の代替として、公式ドキュメントには、以下のライブラリへの移行が推奨されています。

以下は、2017 年の記事ですが、ImageSharp, SkiaSharp について触れられています。

この 2017 年時点での選択肢としてなかったのは、Microsoft.Maui.Graphics で、Microsoft.Maui.Graphics の名前空間で API が抽象化されて、それぞれの OS 向けに実装が提供されています。SkiaSharp での実装も Microsoft.Maui.Graphics.Skia として提供されています。

現時点では、Linux をサポートしている実装は、Microsoft.Maui.Graphics.Skia のみのようです。

Microsoft.Maui.Graphics サンプル コード

コンソール アプリで、図形を描画して、画像として出力するサンプルを書いてみます。

Nuget から、以下のライブラリをインストールしてください。

  • Microsoft.Maui.Graphics
  • Microsoft.Maui.Graphics.Skia

コード例は以下です。

internal class Program
{
	static void Main(string[] args)
	{
		int imageWidth = 400;
		int imageHeigth = 400;
		float displayScale = 1.0f;

		// コンテキストの生成
		BitmapExportContext bitmapExportContext = 
			new SkiaBitmapExportContext(imageWidth, imageHeigth, displayScale);        
		// キャンバスの取得
		ICanvas canvas = bitmapExportContext.Canvas;

		// 背景の塗りつぶし
		canvas.FillColor = Colors.White;
		canvas.FillRectangle(0, 0, imageWidth, imageHeigth);

		// 円の描画
		canvas.FillColor = Colors.Black;
		canvas.FillCircle(imageWidth / 2f, imageHeigth / 2f, 160f);
		canvas.FillCircle(imageWidth / 4f, imageHeigth / 4f, 60f);
		canvas.FillCircle(imageWidth - (imageWidth / 4f), imageHeigth / 4f, 60f);

		// 文字列の描画
		string label = "Hello, Maui.Graphics!";
		canvas.FontColor = Colors.White;
		canvas.FontSize = 26;
		canvas.DrawString(label, 
			0, 0, 
			imageWidth, imageHeigth, 
			HorizontalAlignment.Center, VerticalAlignment.Center);

		// png ファイルとして出力
		bitmapExportContext.WriteToFile("mauiGraphicsDemo001.png");
	}
}

このコードを実行すると、プログラムの出力ディレクトリに、以下の画像が出力されます。 mauiGraphicsDemo001.png

Linux 上で動作させるには?

プログラムの出力ディレクトリ以下の runtimes ディレクトリを見ると分かるのですが、Linux 向けのネイティブ ライブラリが配置されていません。 runtime list 1

Nuget から、以下のライブラリをインストールしてください。

  • SkiaSharpNativeAssets..Linux.NoDependencies

ライブラリ インストール後、ビルドすると、Linux 向けのライブラリが配置されます。

runtime list 2

これで、WSL でも動作するようになります。 今回は、コンソールアプリでのコード例ですが、同様のコードを Azure App Service on Linux でも動作させることができます。

参考リンク

コメント (0)

コメントの投稿