狠狠撸

狠狠撸Share a Scribd company logo
System.Drawing 周りの話
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 1
自己紹介
名前: 藤森 智(ふじもり さとる)

所属: 株式会社ケイ?ジェイ?システムズ代表

仕事: 古典データの検索サービスの開発

 印刷出版や電子書籍のクラウドサービス

 モバイルアプリの開発など

趣味: 料理(韓ドラ好きで韓国料理にはまってる)

 走る(年間1000km、でも痩せない)

 バックオフィス業務(消し込み処理が快感)

Twitter: @masatoru
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 2
目次
WinForms のアプリを .NET6 に移行する
Azure Functions で System.Drawing を使ってみる、ただし。。。
System.Drawing.Common パッケージ
System.Drawing 以外の方法
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 3
WinForms のアプリを .NET6 に移行する
和歌?俳句の検索システム
Windows(WinForms) で動作
縦書きを System.Drawing を使って Canvas に描画
WinForms を .NET6 に移行するメリット
Canvas 部分を Azure Functions で共通化
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 4
縦書きを System.Drawing を使って Canvas に描画
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 5
WinForms を .NET6 に移行するメリット
1つの .exe ファイルで発行可能

Single-file deployment and executable
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>

...

<OutputType>Exe</OutputType>

<SelfContained>true</SelfContained>

<RuntimeIdentifier>win-x64</RuntimeIdentifier>

<PublishReadyToRun>true</PublishReadyToRun>

</PropertyGroup>

ユーザーの PC に .NET Framework のバージョンを気にする必要なし
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 6
System.Drawing を使って Canvas に描画
private void Form1_Paint(object sender, PaintEventArgs e)

{

DrawImage(e.Graphics, 500, 200);

}

void DrawImage(Graphics g, int width, int height)

{

Font fnt = new("MS UI Gothic", 50);

g.DrawString("こんにちは .NET6", fnt, Brushes.Blue, 10, 50);

g.DrawRectangle(new Pen(Color.DarkOrange, 10),

new Rectangle(0, 0, width, height));

}

【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 7
Canvas 部分を Azure Functions で共通化
Bitmap で描画した内容を JPEG で返す Azure Functions
実際にはページング処理をするのに XML ファイルから CosmosDB へ置き換える
など描画以外で工夫している
ただし。。。
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 8
文字や線を Canvas に描画する
using System.Drawing;

Bitmap CreateImage()

{

Bitmap canvas = new(500, 200);

var g = Graphics.FromImage(canvas);

Font fnt = new("MS UI Gothic", 50);

g.DrawString("こんにちは .NET6", fnt, Brushes.Blue, 0, 0);

g.DrawRectangle(new Pen(Color.DarkOrange,10), 

new Rectangle(0, 0, canvas.Width, canvas.Height));
return canvas;

}

【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 9
System.Drawing.Common パッケージ
「.NET 6 での破壊的変更」の一つ
Windows のみサポート
System.Drawing の参照方法(2種類)
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 10
Windows のみサポート
.NET6 における破壊的変更のひとつ
(背景)C 言語で書かれている GDI+(libgdiplus)ライブラリの 30,000 行がテス
トされていない
.NET5 では Linux/Mac でもとりあえず動作していた
AppService / Azure Functions では未サポート
System.Drawing.Common will continue to evolve only in the context of
Windows Forms and GDI+.
Azure Web App sandbox
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 11
Windows でビルドすると警告が出力される
warning CA1416: This call site is reachable on all platforms.

'Bitmap' is only supported on: 'windows'. 

<TargetFramework>net6.0-windows</TargetFramework> で警告を消去可能
Linux では実行時にエラー(ビルドはできる)
The type initializer for 'Gdip' threw an exception.

System.Drawing.Common is not supported on non-Windows platforms.

Linux でも .NET Runtime configuration settings で
"System.Drawing.EnableUnixSupport": true とすれば .NET6 でも動作する(とド
キュメントにはあるが試した限りでは動作しない)

.NET 7 ではこのスイッチは削除される
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 12
System.Drawing.Common の参照方法(2種類)
.NET Platform Extensions
<PackageReference Include="System.Windows.Extensions" Version="6.0.0" />

または
<PackageReference Include="System.Drawing.Common" Version="6.0.0" />

Windows Desktop
<TargetFramework>net6.0-windows</TargetFramework>

<UseWindowsForms>true</UseWindowsForms>

<UseWPF>true</UseWPF>

【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 13
System.Drawing 以外の方法
System.Drawing の代替手段
ImageSharp
SkiaSharp
Microsoft.Maui.Graphics
Linux での環境構築のハードル高め

パッケージをインストールすれば動くというわけではない。
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 14
ImageSharp
A modern, cross-platform, 2D Graphics library for .NET
商用サポートあり
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 15
SkiaSharp
SkiaSharp is a cross-platform 2D graphics API for .NET platforms based on
Google's Skia Graphics Library. It provides a comprehensive 2D API that can
be used across mobile, server and desktop models to render images.
Building on Linux
<PackageReference Include="SkiaSharp" Version="2.88.1" />

<PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="2.88.1" />

<PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="2.88.1" />
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 16
Microsoft.Maui.Graphics
An experimental cross-platform native graphics library.
Goals
No dependencies on System.Drawing
Support all graphics operations within an abstraction that the underlying
abstraction supports.
モバイルやアプリ向け(サーバー向けでは無い?)
Font が効かない  canvas.Font = new Font("MS UI Gothic", 50); 

https://github.com/dotnet/Microsoft.Maui.Graphics/issues/451
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 17
参考資料
.NET 6 での破壊的変更
単一ファイルの配置と実行可能ファイル
System.Drawing.Common が Windows でしかサポートされない
Make System.Drawing.Common only supported on Windows
Win32k.sys (User32/GDI32) Restrictions
github: Microsoft.Maui.Graphics
Maui.Graphics
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 18
この資料のサンプルコード:

https://github.com/masatoru/CreateImageFunctionsSample
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 19
まとめ
System.Drawing は Windows 専用
System.Drawing は App Service では未サポート。動かないというわけではない
System.Drawing の移行先として3つある。MAUI に期待だけど現状は Skia か。
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 20
ご清聴ありがとうございました。
【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26
copyright 2022 @masatoru 21

More Related Content

System.Drawing 周りの話

  • 1. System.Drawing 周りの話 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 1
  • 2. 自己紹介 名前: 藤森 智(ふじもり さとる) 所属: 株式会社ケイ?ジェイ?システムズ代表 仕事: 古典データの検索サービスの開発  印刷出版や電子書籍のクラウドサービス  モバイルアプリの開発など 趣味: 料理(韓ドラ好きで韓国料理にはまってる)  走る(年間1000km、でも痩せない)  バックオフィス業務(消し込み処理が快感) Twitter: @masatoru 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 2
  • 3. 目次 WinForms のアプリを .NET6 に移行する Azure Functions で System.Drawing を使ってみる、ただし。。。 System.Drawing.Common パッケージ System.Drawing 以外の方法 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 3
  • 4. WinForms のアプリを .NET6 に移行する 和歌?俳句の検索システム Windows(WinForms) で動作 縦書きを System.Drawing を使って Canvas に描画 WinForms を .NET6 に移行するメリット Canvas 部分を Azure Functions で共通化 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 4
  • 5. 縦書きを System.Drawing を使って Canvas に描画 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 5
  • 6. WinForms を .NET6 に移行するメリット 1つの .exe ファイルで発行可能 Single-file deployment and executable <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> ... <OutputType>Exe</OutputType> <SelfContained>true</SelfContained> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup> ユーザーの PC に .NET Framework のバージョンを気にする必要なし 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 6
  • 7. System.Drawing を使って Canvas に描画 private void Form1_Paint(object sender, PaintEventArgs e) { DrawImage(e.Graphics, 500, 200); } void DrawImage(Graphics g, int width, int height) { Font fnt = new("MS UI Gothic", 50); g.DrawString("こんにちは .NET6", fnt, Brushes.Blue, 10, 50); g.DrawRectangle(new Pen(Color.DarkOrange, 10), new Rectangle(0, 0, width, height)); } 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 7
  • 8. Canvas 部分を Azure Functions で共通化 Bitmap で描画した内容を JPEG で返す Azure Functions 実際にはページング処理をするのに XML ファイルから CosmosDB へ置き換える など描画以外で工夫している ただし。。。 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 8
  • 9. 文字や線を Canvas に描画する using System.Drawing; Bitmap CreateImage() { Bitmap canvas = new(500, 200); var g = Graphics.FromImage(canvas); Font fnt = new("MS UI Gothic", 50); g.DrawString("こんにちは .NET6", fnt, Brushes.Blue, 0, 0); g.DrawRectangle(new Pen(Color.DarkOrange,10), new Rectangle(0, 0, canvas.Width, canvas.Height)); return canvas; } 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 9
  • 10. System.Drawing.Common パッケージ 「.NET 6 での破壊的変更」の一つ Windows のみサポート System.Drawing の参照方法(2種類) 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 10
  • 11. Windows のみサポート .NET6 における破壊的変更のひとつ (背景)C 言語で書かれている GDI+(libgdiplus)ライブラリの 30,000 行がテス トされていない .NET5 では Linux/Mac でもとりあえず動作していた AppService / Azure Functions では未サポート System.Drawing.Common will continue to evolve only in the context of Windows Forms and GDI+. Azure Web App sandbox 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 11
  • 12. Windows でビルドすると警告が出力される warning CA1416: This call site is reachable on all platforms. 'Bitmap' is only supported on: 'windows'. <TargetFramework>net6.0-windows</TargetFramework> で警告を消去可能 Linux では実行時にエラー(ビルドはできる) The type initializer for 'Gdip' threw an exception. System.Drawing.Common is not supported on non-Windows platforms. Linux でも .NET Runtime configuration settings で "System.Drawing.EnableUnixSupport": true とすれば .NET6 でも動作する(とド キュメントにはあるが試した限りでは動作しない) .NET 7 ではこのスイッチは削除される 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 12
  • 13. System.Drawing.Common の参照方法(2種類) .NET Platform Extensions <PackageReference Include="System.Windows.Extensions" Version="6.0.0" /> または <PackageReference Include="System.Drawing.Common" Version="6.0.0" /> Windows Desktop <TargetFramework>net6.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <UseWPF>true</UseWPF> 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 13
  • 14. System.Drawing 以外の方法 System.Drawing の代替手段 ImageSharp SkiaSharp Microsoft.Maui.Graphics Linux での環境構築のハードル高め パッケージをインストールすれば動くというわけではない。 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 14
  • 15. ImageSharp A modern, cross-platform, 2D Graphics library for .NET 商用サポートあり 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 15
  • 16. SkiaSharp SkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Google's Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images. Building on Linux <PackageReference Include="SkiaSharp" Version="2.88.1" /> <PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="2.88.1" /> <PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="2.88.1" /> 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 16
  • 17. Microsoft.Maui.Graphics An experimental cross-platform native graphics library. Goals No dependencies on System.Drawing Support all graphics operations within an abstraction that the underlying abstraction supports. モバイルやアプリ向け(サーバー向けでは無い?) Font が効かない  canvas.Font = new Font("MS UI Gothic", 50); https://github.com/dotnet/Microsoft.Maui.Graphics/issues/451 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 17
  • 18. 参考資料 .NET 6 での破壊的変更 単一ファイルの配置と実行可能ファイル System.Drawing.Common が Windows でしかサポートされない Make System.Drawing.Common only supported on Windows Win32k.sys (User32/GDI32) Restrictions github: Microsoft.Maui.Graphics Maui.Graphics 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 18
  • 20. まとめ System.Drawing は Windows 専用 System.Drawing は App Service では未サポート。動かないというわけではない System.Drawing の移行先として3つある。MAUI に期待だけど現状は Skia か。 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 20
  • 21. ご清聴ありがとうございました。 【オンライン】.NET 6 移行祭り! C# Tokyo イベント 2022.8.26 copyright 2022 @masatoru 21