SlideShare une entreprise Scribd logo
1  sur  21
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

TDPT + VMCプロトコル on WebRTC
TDPT + VMCプロトコル on WebRTCTDPT + VMCプロトコル on WebRTC
TDPT + VMCプロトコル on WebRTChironroinakae
 
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)NTT DATA Technology & Innovation
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例sairoutine
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)NTT DATA Technology & Innovation
 
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回Yoshiki Hayama
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)NTT DATA Technology & Innovation
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveTokoroten Nakayama
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionYoshifumi Kawai
 

Tendances (20)

TDPT + VMCプロトコル on WebRTC
TDPT + VMCプロトコル on WebRTCTDPT + VMCプロトコル on WebRTC
TDPT + VMCプロトコル on WebRTC
 
MRTK3を調べてみた
MRTK3を調べてみたMRTK3を調べてみた
MRTK3を調べてみた
 
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
Guide To AGPL
Guide To AGPLGuide To AGPL
Guide To AGPL
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
 

Similaire à System.Drawing 周りの話

Titanium もくもく会第6回 Kii Cloud と TiGPUImageView
Titanium もくもく会第6回 Kii Cloud と TiGPUImageViewTitanium もくもく会第6回 Kii Cloud と TiGPUImageView
Titanium もくもく会第6回 Kii Cloud と TiGPUImageView濱田 章吾
 
Windows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAIWindows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAITomokazu Kizawa
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎ken_kitahara
 
20210515 cae linux_install_vb
20210515 cae linux_install_vb20210515 cae linux_install_vb
20210515 cae linux_install_vbYohichiShiina
 
スマ研第2回レポート
スマ研第2回レポートスマ研第2回レポート
スマ研第2回レポートShinpei Niiyama
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
さくらのIoT Platformを使ってみよう ~OSC大阪編~
さくらのIoT Platformを使ってみよう ~OSC大阪編~さくらのIoT Platformを使ってみよう ~OSC大阪編~
さくらのIoT Platformを使ってみよう ~OSC大阪編~法林浩之
 
【de:code19】最高のゲームをつくろう! マイクロソフト Game Stack でゲーム開発をしよう!
【de:code19】最高のゲームをつくろう! マイクロソフト Game Stack でゲーム開発をしよう!【de:code19】最高のゲームをつくろう! マイクロソフト Game Stack でゲーム開発をしよう!
【de:code19】最高のゲームをつくろう! マイクロソフト Game Stack でゲーム開発をしよう!Daisuke Masubuchi
 
みゆっき☆Think#3 「androidに触ってみるよ!」
みゆっき☆Think#3 「androidに触ってみるよ!」みゆっき☆Think#3 「androidに触ってみるよ!」
みゆっき☆Think#3 「androidに触ってみるよ!」techtalkdwango
 
さくらのIoT Platformを使ってみよう ~Developers in KOBE編~
さくらのIoT Platformを使ってみよう ~Developers in KOBE編~さくらのIoT Platformを使ってみよう ~Developers in KOBE編~
さくらのIoT Platformを使ってみよう ~Developers in KOBE編~法林浩之
 
Hardware control by .NET Core 3.1
Hardware control by .NET Core 3.1Hardware control by .NET Core 3.1
Hardware control by .NET Core 3.1Atomu Hidaka
 
Japan Linux Conference 2010 Porting MeeGo to Android platforms 20101112
Japan Linux Conference 2010 Porting MeeGo to Android platforms 20101112Japan Linux Conference 2010 Porting MeeGo to Android platforms 20101112
Japan Linux Conference 2010 Porting MeeGo to Android platforms 20101112Mitz Amano
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
モバイルアプリの高速で安定したビルドを支えるJenkins運用術
モバイルアプリの高速で安定したビルドを支えるJenkins運用術モバイルアプリの高速で安定したビルドを支えるJenkins運用術
モバイルアプリの高速で安定したビルドを支えるJenkins運用術KLab Inc. / Tech
 
もろもろの AI ツールを Windows のローカル環境にインストールする手順
もろもろの AI ツールを Windows のローカル環境にインストールする手順もろもろの AI ツールを Windows のローカル環境にインストールする手順
もろもろの AI ツールを Windows のローカル環境にインストールする手順Hide Koba
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~normalian
 
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)智啓 出川
 

Similaire à System.Drawing 周りの話 (20)

Titanium もくもく会第6回 Kii Cloud と TiGPUImageView
Titanium もくもく会第6回 Kii Cloud と TiGPUImageViewTitanium もくもく会第6回 Kii Cloud と TiGPUImageView
Titanium もくもく会第6回 Kii Cloud と TiGPUImageView
 
Ma8 Caravan 大阪 rev1
Ma8 Caravan 大阪 rev1Ma8 Caravan 大阪 rev1
Ma8 Caravan 大阪 rev1
 
Windows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAIWindows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAI
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
 
20210515 cae linux_install_vb
20210515 cae linux_install_vb20210515 cae linux_install_vb
20210515 cae linux_install_vb
 
Android0422
Android0422Android0422
Android0422
 
スマ研第2回レポート
スマ研第2回レポートスマ研第2回レポート
スマ研第2回レポート
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
さくらのIoT Platformを使ってみよう ~OSC大阪編~
さくらのIoT Platformを使ってみよう ~OSC大阪編~さくらのIoT Platformを使ってみよう ~OSC大阪編~
さくらのIoT Platformを使ってみよう ~OSC大阪編~
 
【de:code19】最高のゲームをつくろう! マイクロソフト Game Stack でゲーム開発をしよう!
【de:code19】最高のゲームをつくろう! マイクロソフト Game Stack でゲーム開発をしよう!【de:code19】最高のゲームをつくろう! マイクロソフト Game Stack でゲーム開発をしよう!
【de:code19】最高のゲームをつくろう! マイクロソフト Game Stack でゲーム開発をしよう!
 
みゆっき☆Think#3 「androidに触ってみるよ!」
みゆっき☆Think#3 「androidに触ってみるよ!」みゆっき☆Think#3 「androidに触ってみるよ!」
みゆっき☆Think#3 「androidに触ってみるよ!」
 
さくらのIoT Platformを使ってみよう ~Developers in KOBE編~
さくらのIoT Platformを使ってみよう ~Developers in KOBE編~さくらのIoT Platformを使ってみよう ~Developers in KOBE編~
さくらのIoT Platformを使ってみよう ~Developers in KOBE編~
 
Hardware control by .NET Core 3.1
Hardware control by .NET Core 3.1Hardware control by .NET Core 3.1
Hardware control by .NET Core 3.1
 
Japan Linux Conference 2010 Porting MeeGo to Android platforms 20101112
Japan Linux Conference 2010 Porting MeeGo to Android platforms 20101112Japan Linux Conference 2010 Porting MeeGo to Android platforms 20101112
Japan Linux Conference 2010 Porting MeeGo to Android platforms 20101112
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
モバイルアプリの高速で安定したビルドを支えるJenkins運用術
モバイルアプリの高速で安定したビルドを支えるJenkins運用術モバイルアプリの高速で安定したビルドを支えるJenkins運用術
モバイルアプリの高速で安定したビルドを支えるJenkins運用術
 
もろもろの AI ツールを Windows のローカル環境にインストールする手順
もろもろの AI ツールを Windows のローカル環境にインストールする手順もろもろの AI ツールを Windows のローカル環境にインストールする手順
もろもろの AI ツールを Windows のローカル環境にインストールする手順
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
 
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
 
Silverlight to Next オンライン セミナー
Silverlight to Next オンライン セミナーSilverlight to Next オンライン セミナー
Silverlight to Next オンライン セミナー
 

Plus de Satoru Fujimori

Thinking the best practice of WebAPI with Azure AD For Xamarin.Forms
Thinking the best practice of WebAPI with Azure AD For Xamarin.FormsThinking the best practice of WebAPI with Azure AD For Xamarin.Forms
Thinking the best practice of WebAPI with Azure AD For Xamarin.FormsSatoru Fujimori
 
Using App Center Auth & Data
Using App Center Auth & DataUsing App Center Auth & Data
Using App Center Auth & DataSatoru Fujimori
 
AzureとXamarin.Formsでプッシュ通知
AzureとXamarin.Formsでプッシュ通知AzureとXamarin.Formsでプッシュ通知
AzureとXamarin.Formsでプッシュ通知Satoru Fujimori
 
Xamarin + Azure Mobile Appsの現実(第2章)
Xamarin + Azure Mobile Appsの現実(第2章)Xamarin + Azure Mobile Appsの現実(第2章)
Xamarin + Azure Mobile Appsの現実(第2章)Satoru Fujimori
 
Xamarin.Formsで縦書きアプリ
Xamarin.Formsで縦書きアプリXamarin.Formsで縦書きアプリ
Xamarin.Formsで縦書きアプリSatoru Fujimori
 

Plus de Satoru Fujimori (7)

Thinking the best practice of WebAPI with Azure AD For Xamarin.Forms
Thinking the best practice of WebAPI with Azure AD For Xamarin.FormsThinking the best practice of WebAPI with Azure AD For Xamarin.Forms
Thinking the best practice of WebAPI with Azure AD For Xamarin.Forms
 
Using App Center Auth & Data
Using App Center Auth & DataUsing App Center Auth & Data
Using App Center Auth & Data
 
AppCenter
AppCenterAppCenter
AppCenter
 
AzureとXamarin.Formsでプッシュ通知
AzureとXamarin.Formsでプッシュ通知AzureとXamarin.Formsでプッシュ通知
AzureとXamarin.Formsでプッシュ通知
 
Xamarin + Azure Mobile Appsの現実(第2章)
Xamarin + Azure Mobile Appsの現実(第2章)Xamarin + Azure Mobile Appsの現実(第2章)
Xamarin + Azure Mobile Appsの現実(第2章)
 
Xamarin.Formsで縦書きアプリ
Xamarin.Formsで縦書きアプリXamarin.Formsで縦書きアプリ
Xamarin.Formsで縦書きアプリ
 
Xmlrpcと品詞分解
Xmlrpcと品詞分解Xmlrpcと品詞分解
Xmlrpcと品詞分解
 

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