C# Bitmap Library to Replace System.Drawing.Com/mon in .NET

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronDrawingは無料でオープンソースであり、ほとんど for .NET描画ライブラリ形式に対応しています

IronDrawingは、Iron Softwareによって開発されたオープンソースライブラリであり、Windows、macOS、およびLinuxプラットフォーム上 for .NETプロジェクトにおいて、C#ソフトウェアエンジニアがSystem.Drawing.Com/monを置換するのを支援します。

グラフィックス、画像、フォントをサポートする .NET 5、6、7、および 8 向けのクラスライブラリや NuGet パッケージの開発は、_容易であるべき_です。

IronDrawingは、進化し続ける.NET 5、6、7、8の新しいグラフィックス標準のすべてをシームレスにつなぐ架け橋として機能します。そのため、開発者は自分が好む標準に合わせて開発を行うだけで済みます。

IronDrawingは無料でオープンソースであり、ほとんど for .NET描画ライブラリ形式に対応しています

文脈

Microsoft .NET Frameworkは、世界中の何百万人ものソフトウェア開発者に利用されている、マルチプラットフォームかつ互換性の高いソフトウェアフレームワークです。 Microsoftは、System.Drawing.Com/monがWindowsプラットフォームでのみサポートされるようになるという互換性破りの変更を発表しました。

これは、System.Drawing.Com/mon を使用するクロスプラットフォームライブラリを維持管理している .NET ライブラリ開発者にとって問題となります。なぜなら、Microsoft が推奨する対応策では、Windows 以外のユーザーをサポートするためにライブラリを再ビルドする必要があるからです。 ボランティアや研究者は、新たに提案されるグラフィックスライブラリが登場するたびに、それらを使用するためにすべてのNuGetパッケージやクラスライブラリを再構築することが求められ、その結果、技術的負債が生じ、最新 for .NETの採用が遅れることになるでしょう。

結局のところ、.NETを使うということは、NuGetを使うということなのです。

NuGetパッケージの開発者たちは、.NETの発展に貢献し、自分たちで書こうとすれば何千時間もかかるであろうコードを毎日パッケージ化して提供することで、私たち全員に恩恵をもたらしてくれています。

この互換性破りの変更により、NuGetの開発が遅延し、.NET開発者が依存しているコードライブラリが放棄されたり、陳腐化したりする可能性があります。 今すぐ行動を起こす必要があります!

当社のソリューション

新旧のグラフィックスライブラリ間を変換する中間グラフィックス形式。

クラスライブラリの開発者として、あなたのパブリックな Font、および Size 入力および出力は、すべての新しい標準をサポートする単一の型のみとする必要があります。 内部的には、これまで通り好きなように進めて構いません。

IronDrawingは.NET Framework 4.62との下位互換性があり、.NETの全バージョン(.NET 8を含む)をサポートしています。

IronDrawingの開発とリリースは、Font、および Size といった重要なクラスに対する統一されたフォーマットが欠如しているという課題に対し、オープンソースのソリューションを提供することで解決します。 IronSoftware.Drawing は、これらの型の実装を SkiaSharp、および SixLabors 間でシームレスに変換します。 これにより、開発者であるあなたは、ライブラリ内のこれらのクラスのすべてのインスタンスを置き換える必要がなくなります。

例えばMicrosoft.Maui.Graphics.Platform.PlatformImage

なぜこれを無料で提供しているのか

Iron Softwareの私たちは、長年にわたり.NET開発に携わってきたシニア開発者であり、.NETの進化を重視し、その成長と成功を願っているからこそ、IronDrawingを開発しました。 .NET 7に見られるように、.NETが成長し進化し続けていることを大変嬉しく思います。私たちは毎日NuGetを利用していますが、皆さんもきっとそうでしょう。 私たちは、System.Drawingからの移行を容易にし、将来に向けた移行を促進することを支持し、期待しています。

私たちは、NuGetエコシステムが今後も発展し続け、すべて for .NET開発者が恩恵を受けられるよう、すべて for .NETクラスライブラリおよびNuGet開発をより容易にしたいと考えています。

IronSoftware.Drawing 機能

  • AnyBitmap: あらゆる環境で互換性のある Bitmap クラス。 IronSoftware.Drawing.AnyBitmap と以下の間での暗黙の型変換がサポートされています:
    • System.Drawing.Bitmap
    • System.Drawing.Image
    • SkiaSharp.SKBitmap
    • SkiaSharp.SKImage
    • SixLabors.ImageSharp
    • Microsoft.Maui.Graphics.Platform.PlatformImage
  • Color: あらゆる環境で互換性のある Color クラス。 IronSoftware.Drawing.Co/lor と以下の間での暗黙の型変換がサポートされています:
    • System.Drawing.Co/lor
    • SkiaSharp.SKColor
    • SixLabors.ImageSharp.Co/lor
    • SixLabors.ImageSharp.PixelFormats
  • Rectangle: あらゆる環境で互換性のある Rectangle クラス。 IronSoftware.Drawing.Rectangle と以下の間での暗黙の型変換がサポートされています:
    • System.Drawing.Rectangle
    • SkiaSharp.SKRect
    • SkiaSharp.SKRectI
    • SixLabors.ImageSharp.Rectangle
  • Font: あらゆる環境で互換性のあるFontクラス。 IronSoftware.Drawing.Font と以下の間での暗黙の型変換がサポートされています:
    • System.Drawing.Font
    • SkiaSharp.SKFont
    • SixLabors.Fonts.Font

互換性

IronSoftware.Drawing は、以下のプラットフォームとの互換性を備えています:

  • .NET 8、.NET 7、.NET 6、.NET 5、.NET Core、.NET Standard、および .NET Framework 4.62 以降
  • Windows、macOS、Linux、Docker、Azure、およびAWS

インストール

IronDrawing (IronSoftware.Drawing) NuGet パッケージのインストールは、迅速かつ簡単です。 パッケージは次のようにインストールしてください:

Install-Package IronSoftware.System.Drawing

または、NuGetの公式ウェブサイトから直接ダウンロードすることもできます。

インストール後、C# コードの先頭に using IronSoftware.Drawing; を追加することで、すぐに使い始めることができます。

コード例

AnyBitmap の例

:path=/static-assets/drawing/content-code-examples/get-started/anybitmap.cs
using IronSoftware.Drawing;
using System.IO;
using System.Drawing;

// Create a new AnyBitmap object from a file
// Replace "FILE_PATH" with the actual path of the image you want to process
var bitmap = AnyBitmap.FromFile("FILE_PATH");

// Save the AnyBitmap object as a JPEG file
bitmap.SaveAs("result.jpg");

// Export the AnyBitmap as a byte array
// This can be useful if you want to send the image data over a network or save it in a database
var bytes = bitmap.ExportBytes();

// Create a memory stream to export the AnyBitmap as a JPEG stream with 100% quality
using (var resultExport = new MemoryStream())
{
    // This exports the image to the stream with the specified format and quality
    bitmap.ExportStream(resultExport, AnyBitmap.ImageFormat.Jpeg, 100);
    // Be sure to use 'using' or manually close the stream to release resources
}

// Casting between System.Drawing.Bitmap and IronSoftware.Drawing.AnyBitmap
// Load a System.Drawing.Bitmap from the same file
System.Drawing.Bitmap image = new System.Drawing.Bitmap("FILE_PATH");

// This is an implicit conversion from System.Drawing.Bitmap to IronSoftware.Drawing.AnyBitmap
// This step is necessary if you are working with System.Drawing.Bitmap and need to convert to IronSoftware.Drawing.AnyBitmap for processing
IronSoftware.Drawing.AnyBitmap anyBitmap = AnyBitmap.FromBitmap(image);

// Save the resulting AnyBitmap from casting as a PNG file
anyBitmap.SaveAs("result-from-casting.png");
Imports IronSoftware.Drawing
Imports System.IO
Imports System.Drawing

' Create a new AnyBitmap object from a file
' Replace "FILE_PATH" with the actual path of the image you want to process
Private bitmap = AnyBitmap.FromFile("FILE_PATH")

' Save the AnyBitmap object as a JPEG file
bitmap.SaveAs("result.jpg")

' Export the AnyBitmap as a byte array
' This can be useful if you want to send the image data over a network or save it in a database
Dim bytes = bitmap.ExportBytes()

' Create a memory stream to export the AnyBitmap as a JPEG stream with 100% quality
Using resultExport = New MemoryStream()
	' This exports the image to the stream with the specified format and quality
	bitmap.ExportStream(resultExport, AnyBitmap.ImageFormat.Jpeg, 100)
	' Be sure to use 'using' or manually close the stream to release resources
End Using

' Casting between System.Drawing.Bitmap and IronSoftware.Drawing.AnyBitmap
' Load a System.Drawing.Bitmap from the same file
Dim image As New System.Drawing.Bitmap("FILE_PATH")

' This is an implicit conversion from System.Drawing.Bitmap to IronSoftware.Drawing.AnyBitmap
' This step is necessary if you are working with System.Drawing.Bitmap and need to convert to IronSoftware.Drawing.AnyBitmap for processing
Dim anyBitmap As IronSoftware.Drawing.AnyBitmap = AnyBitmap.FromBitmap(image)

' Save the resulting AnyBitmap from casting as a PNG file
anyBitmap.SaveAs("result-from-casting.png")
$vbLabelText   $csharpLabel

色の例

:path=/static-assets/drawing/content-code-examples/get-started/color.cs
using IronSoftware.Drawing;
using System;

// The IronSoftware.Drawing library provides enhanced color manipulation features.
// This example demonstrates creating color objects and converting between
// System.Drawing.Color and IronSoftware.Drawing.Color.

// Create a new Color object from a hex string.
Color fromHex = Color.FromHex("#191919");

// Create a new Color object from RGB values.
Color fromRgb = Color.FromRgb(255, 255, 0);

// Create a new Color object using an enumeration.
Color fromEnum = Color.Crimson;

// Casting between System.Drawing.Color and IronSoftware.Drawing.Color.
System.Drawing.Color drawingColor = System.Drawing.Color.Red;

// Convert System.Drawing.Color to IronSoftware.Drawing.Color.
IronSoftware.Drawing.Color ironColor = Color.FromSystemColor(drawingColor);

// Access the alpha, red, green, and blue components of the IronSoftware.Drawing.Color.
byte alpha = ironColor.A;
byte red = ironColor.R;
byte green = ironColor.G;
byte blue = ironColor.B;

// Calculate the luminance of the color.
// Luminance is a value from 0 (black) to 100 (white) where 50 is the perceptual "middle grey".
double luminance = ironColor.GetLuminance();

// Log the calculated attributes to the console.
Console.WriteLine($"Color Details - ARGB: ({alpha}, {red}, {green}, {blue}), Luminance: {luminance}");
Imports IronSoftware.Drawing
Imports System

' The IronSoftware.Drawing library provides enhanced color manipulation features.
' This example demonstrates creating color objects and converting between
' System.Drawing.Color and IronSoftware.Drawing.Color.

' Create a new Color object from a hex string.
Private fromHex As Color = Color.FromHex("#191919")

' Create a new Color object from RGB values.
Private fromRgb As Color = Color.FromRgb(255, 255, 0)

' Create a new Color object using an enumeration.
Private fromEnum As Color = Color.Crimson

' Casting between System.Drawing.Color and IronSoftware.Drawing.Color.
Private drawingColor As System.Drawing.Color = System.Drawing.Color.Red

' Convert System.Drawing.Color to IronSoftware.Drawing.Color.
Private ironColor As IronSoftware.Drawing.Color = Color.FromSystemColor(drawingColor)

' Access the alpha, red, green, and blue components of the IronSoftware.Drawing.Color.
Private alpha As Byte = ironColor.A
Private red As Byte = ironColor.R
Private green As Byte = ironColor.G
Private blue As Byte = ironColor.B

' Calculate the luminance of the color.
' Luminance is a value from 0 (black) to 100 (white) where 50 is the perceptual "middle grey".
Private luminance As Double = ironColor.GetLuminance()

' Log the calculated attributes to the console.
Console.WriteLine($"Color Details - ARGB: ({alpha}, {red}, {green}, {blue}), Luminance: {luminance}")
$vbLabelText   $csharpLabel

長方形の例

:path=/static-assets/drawing/content-code-examples/get-started/rectangle.cs
using IronSoftware.Drawing;
using System.Drawing;

// Declare an IronSoftware.Drawing.Rectangle object
IronSoftware.Drawing.Rectangle ironRectangle = new IronSoftware.Drawing.Rectangle(5, 5, 50, 50);

// Declare a System.Drawing.Rectangle object
System.Drawing.Rectangle systemRectangle = new System.Drawing.Rectangle(10, 10, 150, 150);

// Implicitly convert System.Drawing.Rectangle to IronSoftware.Drawing.Rectangle
// Note: Uncomment and use appropriate conversion methods if available in the IronSoftware.Drawing library
// ironRectangle = (IronSoftware.Drawing.Rectangle)systemRectangle;

// Output the properties of IronSoftware.Drawing.Rectangle if conversion is successful
// These Console.WriteLine statements assume this code runs in a console environment
Console.WriteLine(ironRectangle.X);
Console.WriteLine(ironRectangle.Y);
Console.WriteLine(ironRectangle.Width);
Console.WriteLine(ironRectangle.Height);
Imports IronSoftware.Drawing
Imports System.Drawing

' Declare an IronSoftware.Drawing.Rectangle object
Private ironRectangle As New IronSoftware.Drawing.Rectangle(5, 5, 50, 50)

' Declare a System.Drawing.Rectangle object
Private systemRectangle As New System.Drawing.Rectangle(10, 10, 150, 150)

' Implicitly convert System.Drawing.Rectangle to IronSoftware.Drawing.Rectangle
' Note: Uncomment and use appropriate conversion methods if available in the IronSoftware.Drawing library
' ironRectangle = (IronSoftware.Drawing.Rectangle)systemRectangle;

' Output the properties of IronSoftware.Drawing.Rectangle if conversion is successful
' These Console.WriteLine statements assume this code runs in a console environment
Console.WriteLine(ironRectangle.X)
Console.WriteLine(ironRectangle.Y)
Console.WriteLine(ironRectangle.Width)
Console.WriteLine(ironRectangle.Height)
$vbLabelText   $csharpLabel

フォントの例

:path=/static-assets/drawing/content-code-examples/get-started/font.cs
using System;
using System.Drawing;
using IronSoftware.Drawing;

// Create a new Font object with a specified font family, style, and size
IronSoftware.Drawing.Font font = new IronSoftware.Drawing.Font("Times New Roman", FontStyle.Italic | FontStyle.Bold, 30);

// Create a new instance of System.Drawing.Font
System.Drawing.Font drawingFont = new System.Drawing.Font("Courier New", 30);

try
{
    // Attempt to cast System.Drawing.Font to IronSoftware.Drawing.Font
    // Note: This cast may not be directly possible if the libraries do not support each other;
    // additional conversion logic might be required.
    IronSoftware.Drawing.Font ironFont = new IronSoftware.Drawing.Font(drawingFont.FontFamily.Name, drawingFont.Style, drawingFont.Size);

    // Accessing properties of the IronSoftware.Drawing.Font object
    string familyName = ironFont.FamilyName; // Get the font family name
    FontStyle style = ironFont.Style;       // Get the combined font style (italic, bold, etc.)
    float size = ironFont.Size;             // Get the font size
    bool isItalic = ironFont.Italic;        // Determine if the font style includes Italic
    bool isBold = ironFont.Bold;            // Determine if the font style includes Bold

    // Output the font properties to verify correctness
    Console.WriteLine($"Family: {familyName}, Style: {style}, Size: {size}, Italic: {isItalic}, Bold: {isBold}");
}
catch (InvalidCastException)
{
    Console.WriteLine("The conversion between System.Drawing.Font and IronSoftware.Drawing.Font is not directly supported.");
}
catch (Exception ex)
{
    Console.WriteLine($"An error occurred: {ex.Message}");
}
Imports System
Imports System.Drawing
Imports IronSoftware.Drawing

' Create a new Font object with a specified font family, style, and size
Private font As New IronSoftware.Drawing.Font("Times New Roman", FontStyle.Italic Or FontStyle.Bold, 30)

' Create a new instance of System.Drawing.Font
Private drawingFont As New System.Drawing.Font("Courier New", 30)

Try
	' Attempt to cast System.Drawing.Font to IronSoftware.Drawing.Font
	' Note: This cast may not be directly possible if the libraries do not support each other;
	' additional conversion logic might be required.
	Dim ironFont As New IronSoftware.Drawing.Font(drawingFont.FontFamily.Name, drawingFont.Style, drawingFont.Size)

	' Accessing properties of the IronSoftware.Drawing.Font object
	Dim familyName As String = ironFont.FamilyName ' Get the font family name
	Dim style As FontStyle = ironFont.Style ' Get the combined font style (italic, bold, etc.)
	Dim size As Single = ironFont.Size ' Get the font size
	Dim isItalic As Boolean = ironFont.Italic ' Determine if the font style includes Italic
	Dim isBold As Boolean = ironFont.Bold ' Determine if the font style includes Bold

	' Output the font properties to verify correctness
	Console.WriteLine($"Family: {familyName}, Style: {style}, Size: {size}, Italic: {isItalic}, Bold: {isBold}")
Catch e1 As InvalidCastException
	Console.WriteLine("The conversion between System.Drawing.Font and IronSoftware.Drawing.Font is not directly supported.")
Catch ex As Exception
	Console.WriteLine($"An error occurred: {ex.Message}")
End Try
$vbLabelText   $csharpLabel

サポートについて

ライセンス

ライセンス情報はこちらをご覧ください:LICENSE.txt

寄稿する

IronDrawing オープンソースプロジェクトへの貢献をご希望の場合は、GitHub のリポジトリにプルリクエストを送信する前に、ライセンスをお読みください。

情報

Iron Softwareに関する詳細については、当社のウェブサイトをご覧ください: https://ironsoftware.com/

Iron Softwareによるサポート

一般的なサポートや技術的なお問い合わせについては、以下のメールアドレスまでご連絡ください: mailto:support@ironsoftware.com/mailto:support@ironsoftware.com

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

準備はできましたか?
Nuget ダウンロード 16,991,182 | バージョン: 2025.3 just released
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronSoftware.System.Drawing
サンプルを実行するHTML が PDF に変換されるのを確認します。