SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

ImageSharp v1.0.0beta1がリリースされたので使ってみた

.Netの様々な環境で動作する、ImageSharpという画像処理ライブラリのv1.0.0beta1がリリースされました

github.com

以前.NET blogの↓の記事などでも紹介されてたライブラリです。
https://blogs.msdn.microsoft.com/dotnet/2017/01/19/net-core-image-processing/

他のクロスプラットフォームな画像処理ライブラリ(ImageMagickやSkiaなど)には依存せず、すべてC#で実装されてます。
また、.NET standardなライブラリになっているので、
通常の.NET Framework環境だけでなく、UWPなどの環境や.NET Core環境、Xamarin環境などでも使えるようです。

ImageSharpで提供してる機能などは、↓のページにまとまっています。
https://github.com/SixLabors/ImageSharp/blob/master/features.md

画像の読み書きだけでなく、色々な画像処理の定番アルゴリズム類や図形描画などの機能も実装されてます。

個人的には、.NET環境での画像処理ライブラリの大本命になるんじゃないかな、、と思ってて、 リリースされるのを首を長くして待ってました。
(といっても、今回はβ版のリリースなので、正式なリリースはまだまだ先でしょうが・・・)

準備

インストール

Nugetで「ImageSharp」で検索し、↓のパッケージをインストールします。
f:id:minami_SC:20170916111408p:plain
まだβ版なので、「プレリリースを含める」にチェックを入れないと検索結果に出てきません。注意しましょう。

コンソールからインストールする場合は以下のコマンド。

Install-Package SixLabors.ImageSharp
名前空間の設定

ImageSharpを利用するコードに、以下のusing文を追加しておきましょう。

using SixLabors.ImageSharp;

使ってみる

まだドキュメント類はあまり整備されてないんですが、適当に使ってみました。
まずは画像を読み込んでから、リサイズ&モノクロ化をして結果をファイルに保存してみます。

f:id:minami_SC:20170916111448j:plainf:id:minami_SC:20170916111455j:plain
元画像と結果画像

        static void Main(string[] args)
        {
            // 画像の読み込み
            using (Image<Rgba32> image = Image.Load("Images/source.jpg"))
            {
                // 読み込んだ画像を編集(Mutateメソッドを呼び出すと、画像を編集できるようになる)
                image.Mutate(x =>
                    {
                        // リサイズ&グレースケール化を行う
                        x.Resize(image.Width / 2, image.Height / 2)
                         .Grayscale();
                    });

                // 結果画像を保存
                image.Save("result.jpg");
            }
        }

読み込んだ画像データはIDisposableなオブジェクトになっているので、using文でキッチリとリソース管理できます。
また各種の画像処理はメソッドチェーン形式で繋いで書けます。
イイ感じですね!!

ちなみに画像データに編集を加える場合には、Mutateメソッドを呼び出し、Mutateメソッドの引数として渡すラムダ式/関数の中で処理する必要があるので注意が必要です。

図形の描画

DrawLines、DrawTextなどといった、図形や文字などを描画するためのAPIが用意されています。

先ほどの画像データに、DrawLines関数で直線を描画してみます。

ImageSharp.Drawingのインストール

この手の図形描画系のメソッドは、ImageSharp.Drawingという別パッケージに分割されています。

Nugetで「ImageSharp.Drawing」を検索し、以下のパッケージをインストールします。
f:id:minami_SC:20170916111714p:plain

直線の描画

DrawLinesという関数で、頂点リストで定義された複数の直線をまとめて描画できます。

            // 画像の読み込み
            using (Image<Rgba32> image = Image.Load("Images/source.jpg"))
            {
                // 読み込んだ画像を編集(Mutateメソッドを呼び出すと、画像を編集できるようになる)
                image.Mutate(x =>
                    {
                        // リサイズ&グレースケール化を行う
                        x.Resize(image.Width / 2, image.Height / 2)
                         .Grayscale();

                        // 頂点のリストを定義
                        var points = new SixLabors.Primitives.PointF[] {
                            new Vector2(10, 10),
                            new Vector2(480, 50),
                            new Vector2(540, 420),
                        };
                        // 頂点リストで定義された複数の直線を描画
                        x.DrawLines(new Rgba32(255, 0, 0, 127), 5, points);
                    });

                // 結果画像を保存
                image.Save("result.jpg");
            }

f:id:minami_SC:20170916111701j:plain

ピクセル操作

画像を読み込んだImageオブジェクトのインデクサを通して、ピクセルデータの編集ができます。
以下の例では、x, y座標に応じて色を変えて、グラデーションを描画しています。

        static void Main(string[] args)
        {
            // 640×480pxの空の画像を作成
            using (var image = new Image<Rgba32>(640, 480))
            {
                for (var y = 0; y < image.Height; y++)
                {
                    for (var x = 0; x < image.Width; x++)
                    {
                        // x, y座標に応じて色を変えて、グラデーションを描画
                        float r = (float)x / image.Width;
                        float g = (float)y / image.Height;
                        float b = 0;
                        image[x, y] = new Rgba32(r, g, b);
                    }
                }

                // 結果画像を保存
                image.Save("result.jpg");
            }
        }

f:id:minami_SC:20170916111829j:plain

ちなみに以下の公式ブログなどをみると、ピクセルデータのアクセス用APIとしては、今後System.MemoryのSpanを用いたAPIを用意するっぽい。
https://sixlabors.com/blog/announcing-imagesharp-beta-1/

この辺、まだ.net standardなライブラリでは使えないので、今後対応するってことみたいですね。