ラスター画像とベクター画像の描画

Web サイト、デスクトップ アプリケーション、モバイル アプリのいずれを構築している場合でも、画像を処理および編集する際には、画像を操作して描画する機能が重要な要素となります。高度でありながら実装が簡単な描画機能を開発者に提供するために、C# .NET アプリケーション用に設計された強力な API である Aspose.Imaging.Drawing を導入し、さまざまな画像描画機能を提供します。

C# .NET 描画ライブラリ

Aspose.Imaging.Drawing は、高度な画像処理技術を使用してラスター イメージとベクター イメージを処理できる堅牢な API です。ネイティブ バイト アクセスにより、API はイメージの作成または操作時に高い処理速度を保証します。 API を使用すると、ピクセル操作とグラフィックス パスを使用してオブジェクトを描画し、画像をある形式から別の形式に変換できます。 Aspose.Imaging.Drawing は、デフォルトのグラフィックス エンジンとして Aspose.Drawing を使用します。これは、外部依存関係なしでテキスト、ジオメトリ、および画像を描画するための完全な機能セットを提供するクロスプラットフォーム 2D グラフィックス ライブラリです。

Aspose.Imaging.Drawing は NuGet からダウンロードしてインストールできます。

PM> NuGet\Install-Package Aspose.Imaging.Drawing

次に、この .NET Drawing API のいくつかの顕著な機能と、ソース コードを使用したその使用法を見てみましょう。

.NET 描画ライブラリを使用したグラフィックの作成

Aspose.Imaging.Drawing を使用すると、円、線、三角形、正方形、楕円などのさまざまなオブジェクトを描画して画像を作成できます。ラスター画像だけでなく、APIを使用してベクター画像も生成できます。この .NET 描画 API を使用して C# でラスター イメージとベクター イメージを描画する方法を見てみましょう。

ラスター画像の描画

以下は、Aspose.Imaging.Drawing API を使用してラスター イメージを描画する手順です。

  • まず、Image.Create() メソッドを使用して、目的の形式のイメージを作成します。
  • 次に、Graphics クラスのオブジェクトを作成し、上で作成した Image で初期化します。
  • Graphics.Clear メソッドを使用して画像の表面をクリアします。
  • 新しいペンを作成し、希望の色で初期化します。
  • Graphics.DrawEllipse() メソッドを使用して、楕円 (またはその他のグラフィック オブジェクト) を描画します。
  • Graphics.FillPolygon() メソッドを使用して多角形を描画します。
  • 最後に、Image.Save() メソッドを使用して画像を保存します。

次のコード スニペットは、C# で画像を描画する方法を示しています。

string outputFolder = @"Output\";

// BmpOptions のインスタンスを作成し、そのさまざまなプロパティを設定します
BmpOptions imageOptions = new BmpOptions();
imageOptions.BitsPerPixel = 24;

// FileCreateSource のインスタンスを作成し、Source プロパティに割り当てます。 
imageOptions.Source = new FileCreateSource(outputFolder + "result.bmp", false);

using (var image = Image.Create(imageOptions, 500, 500))
{
    var graphics = new Graphics(image);

    // 画像の表面を白色でクリアし、青色のペンオブジェクトを作成して初期化します。
    graphics.Clear(Color.White);
    var pen = new Pen(Color.Blue);

    // 幅 150、高さ 100 の境界四角形を定義して楕円を描画します。また、LinearGradientBrush を使用して多角形を描画します。
    graphics.DrawEllipse(pen, new Rectangle(10, 10, 150, 100));

    using (var linearGradientBrush = new LinearGradientBrush(image.Bounds, Color.Red, Color.White, 45f))
    {
        graphics.FillPolygon(linearGradientBrush, new[] { new Point(200, 200), new Point(400, 200), new Point(250, 350) });
    }

    // 画像を保存
    image.Save();
}

ベクトル画像を描画

ラスター イメージと同様に、SVG などのベクター グラフィックスをいくつかの簡単な手順で描画できます。 C# 描画ライブラリを使用してベクター イメージを作成しましょう。

  • まず、MemoryStream オブジェクトを作成します。
  • 次に、SVG 画像を読み込みます。
  • SVG を PNG にラスタライズし、結果をストリームに書き込みます。
  • さらに描画するためにストリームから PNG 画像をロードします。
  • 既存のSVG画像上にPNG画像を描画します。
  • 最後に、結果を保存します。

次のコード スニペットは、C# でベクター イメージを描画する方法を示しています。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (MemoryStream drawnImageStream = new MemoryStream())
{
    // まず、Svg を Png にラスタライズし、結果をストリームに書き込みます。
    using (SvgImage svgImage = (SvgImage)Image.Load(templatesFolder + "template.svg"))
    {
        SvgRasterizationOptions rasterizationOptions = new SvgRasterizationOptions();
        rasterizationOptions.PageSize = svgImage.Size;

        PngOptions saveOptions = new PngOptions();
        saveOptions.VectorRasterizationOptions = rasterizationOptions;

        svgImage.Save(drawnImageStream, saveOptions);

        // 次に、さらに描画するためにストリームから Png 画像をロードします。
        drawnImageStream.Seek(0, System.IO.SeekOrigin.Begin);
        using (RasterImage imageToDraw = (RasterImage)Image.Load(drawnImageStream))
        {
            // 既存の Svg イメージに描画します。
            Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D graphics = new Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D(svgImage);

            // 描画した画像全体を2倍に縮小し、描画面の中心に描画します。
            int width = imageToDraw.Width / 2;
            int height = imageToDraw.Height / 2;
            Point origin = new Point((svgImage.Width - width) / 2, (svgImage.Height - height) / 2);
            Size size = new Size(width, height);

            graphics.DrawImage(imageToDraw, origin, size);

            // 結果画像を保存する
            using (SvgImage resultImage = graphics.EndRecording())
            {
                resultImage.Save(outputFolder + "vector_image.svg");
            }
        }
    }
}

画像にマスキングを適用する

画像編集におけるマスキングとは、画像の特定の部分を選択的に非表示にしたり、表示したりする技術を指します。これには、マスクの作成が含まれます。マスクは基本的に、元の画像の各ピクセルの透明度または不透明度を定義するグレースケール画像です。画像マスキングは、認識と診断のために広く行われています。

Aspose.Image.Drawing は、イメージ マスキングを適用する 2 つの方法を提供します。

  • 手動マスキング - 一連の ROI をマスクとして使用します。各スライスの ROI はマスクを定義するために使用されます。追加のユーザー入力が必要です。
  • 自動マスキング - ユーザーからの大量の入力データは必要ありませんが、それほど正確ではない可能性があります。

C# コードで画像に手動および自動マスキングを適用する方法を見てみましょう。

手動画像マスキング

次のコード スニペットは、C# で画像に手動マスキングを適用する方法を示しています。

string outputFolder = @"Output\";

// ソースファイル
string sourceFileName = outputFolder + "couple.png";

// グラフィックスパスの作成
GraphicsPath manualMask = new GraphicsPath();

// 図形を追加する
Figure firstFigure = new Figure();
firstFigure.AddShape(new EllipseShape(new RectangleF(100, 30, 40, 40)));
firstFigure.AddShape(new RectangleShape(new RectangleF(10, 200, 50, 30)));

// 図を追加
manualMask.AddFigure(firstFigure);

GraphicsPath subPath = new GraphicsPath();
Figure secondFigure = new Figure();
secondFigure.AddShape(
    new PolygonShape(
     new PointF[]
     {
        new PointF(310, 100), new PointF(350, 200), new PointF(250, 200)

     }, true));

secondFigure.AddShape(new PieShape(new RectangleF(10, 10, 80, 80), 30, 120));
subPath.AddFigure(secondFigure);
manualMask.AddPath(subPath);

// マスキングを適用する
using (RasterImage image = (RasterImage)Image.Load(sourceFileName))
{
    MaskingOptions maskingOptions = new MaskingOptions()
    {
        Method = SegmentationMethod.Manual,
        Args = new ManualMaskingArgs
        {
            Mask = manualMask
        },
        Decompose = false,
        ExportOptions =
      new PngOptions()
      {
          ColorType = PngColorType.TruecolorWithAlpha,
          Source = new StreamSource(new MemoryStream())
      },
    };
    MaskingResult results = new ImageMasking(image).Decompose(maskingOptions);
    // 最終的なマスキング結果を保存します。
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "manual_masking.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

自動画像マスキング

以下のコード スニペットは、.NET 描画 API を使用して画像に自動マスキングを適用します。

string outputFolder = @"Output\";

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(outputFolder + "couple.jpg"))
{
    // 自動計算されたストロークでグラフ カットを使用するには、AutoMaskingGraphCutOptions が使用されます。
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // 画像の分解中にデフォルトのストロークの新しい計算を実行する必要があることを示します。
        CalculateDefaultStrokes = true,
        
        // 画像サイズに基づいて後処理フェザリング半径を設定します。
        FeatheringRadius = (Math.Max(image.Width, image.Height) / 500) + 1,
        Method = SegmentationMethod.GraphCut,
        Decompose = false,
        ExportOptions =
            new PngOptions()
            {
                ColorType = PngColorType.TruecolorWithAlpha,
                Source = new FileCreateSource(outputFolder + "auto_masking.png")
            },
        BackgroundReplacementColor = Color.Transparent
    };

    results = new ImageMasking(image).Decompose(options);

    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "auto_masking_2.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

画像にフィルターを適用する

画像にフィルターを適用することはさまざまな目的に役立ち、人々は実用的および芸術的なさまざまな理由でフィルターを使用します。画像フィルターの最も一般的な用途には、色補正、画質の向上、特殊効果の適用、ノイズ低減などが含まれます。 Aspose.Imaging.Drawing は、メディアン、モーション ウィーナー、ガウス ウィーナーなど、画像に適用できるいくつかの種類のフィルターをサポートしています。

デモとして、Aspose.Imaging.Drawing を使用して画像にメディアン フィルターを適用する次のコードを見てください。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// ノイズの多い画像をロードする 
using (Image image = Image.Load(templatesFolder + "template.gif"))
{
    // 画像をRasterImageにキャストします
    RasterImage rasterImage = image as RasterImage;
    if (rasterImage == null)
    {
        return;
    }

    // MedianFilterOptions クラスのインスタンスを作成してサイズを設定し、RasterImage オブジェクトに MedianFilterOptions フィルターを適用して、結果の画像を保存します
    MedianFilterOptions options = new MedianFilterOptions(4);
    rasterImage.Filter(image.Bounds, options);

    // 画像を保存
    image.Save(outputFolder + "median_filter.gif");
}

画像のトリミング、回転、サイズ変更

画像のトリミング、回転、サイズ変更は、画像編集アプリケーションの重要な機能と考えられています。これらは、デジタル画像を操作するために使用される最も一般的な画像処理操作です。 Aspose.Imaging.Drawing API を使用して画像をトリミング、回転、サイズ変更する方法を見てみましょう。

画像をトリミングする

画像をトリミングするには、画像の 4 つの側面すべてにシフト値を指定する必要があります。これらの値に基づいて、画像の境界が画像の中心に向かってシフトされます。次の C# コード スニペットは、指定されたシフト値に基づいて画像をトリミングします。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// 既存の画像を RasterImage クラスのインスタンスにロードします
using (RasterImage rasterImage = (RasterImage)Image.Load(templatesFolder + "template.jpg"))
{
    // パフォーマンスを向上させるために、トリミングする前に画像をキャッシュする必要があります。
    if (!rasterImage.IsCached)
    {
        rasterImage.CacheData();
    }

    // 4 辺すべてのシフト値を定義します
    int leftShift = 10;
    int rightShift = 10;
    int topShift = 10;
    int bottomShift = 10;

    // シフト値に基づいて、画像にトリミングを適用します。トリミング方法により、画像の境界が画像の中心に向かってシフトされ、結果がディスクに保存されます。
    rasterImage.Crop(leftShift, rightShift, topShift, bottomShift);

    // 切り抜いた画像を保存する
    rasterImage.Save(outputFolder + "cropped_image.jpg");
}

画像を回転する

画像を回転するために、Aspose.Imaging.Drawing は、画像を回転するだけでなく (必要に応じて) 反転する RotateFlip メソッドを提供します。 RotateFlipType 列挙型から目的の回転と反転のオプションを選択できます。次のコード スニペットは、C# で画像を回転するが反転はしない方法を示しています。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// 画像のロードと回転
using (var image = Image.Load(templatesFolder + "template.jpg"))
{
    // 画像を回転する
    image.RotateFlip(RotateFlipType.Rotate270FlipNone);

    // 画像を保存
    image.Save(outputFolder + "rotated_image.jpg");
}

画像のサイズを変更する

Aspose.Imaging.Drawing を使用した画像のサイズ変更は、パイと同じくらい簡単です。 Resize メソッドを呼び出して、新しい高さと幅の値を渡すだけです。次のコード スニペットは、C# で画像のサイズを変更する方法を示しています。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (Image image = Image.Load(templatesFolder + "template.jpg"))
{
    // 画像のサイズを変更する
    image.Resize(300, 300);

    // 画像を保存
    image.Save(outputFolder + "resized_image.jpg");
}   

画像を他の形式に変換する

Aspose.Imaging.Drawing API を使用して画像を変換するには、画像をロードし、目的の出力形式で保存するだけです。次のコード スニペットは、JPG 画像を WebP、PSD、PDF、および TIFF 形式に変換します。

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (var img = Aspose.Imaging.Image.Load(templatesFolder + "template.jpg"))
{
    // さまざまな画像形式で保存する
    img.Save(outputFolder + "output.webp", new Aspose.Imaging.ImageOptions.WebPOptions());
    img.Save(outputFolder + "output.psd ", new Aspose.Imaging.ImageOptions.PsdOptions());
    img.Save(outputFolder + "output.tiff", new Aspose.Imaging.ImageOptions.TiffOptions(TiffExpectedFormat.Default));

    // PDFとして保存
    PdfOptions exportOptions = new PdfOptions();
    exportOptions.PdfDocumentInfo = new Aspose.Imaging.FileFormats.Pdf.PdfDocumentInfo();
    img.Save(outputFolder + "output.pdf", exportOptions);
}

無料の API ライセンスを取得する

Aspose.Imaging.Drawing API を評価したい場合は、無料の一時ライセンスを取得すると、制限なしで API を最大限に使用できるようになります。

結論

グラフィックスと画像処理の分野では、Aspose.Imaging.Drawing API は、C# .NET 開発者にとって多用途で強力なツールとして際立っています。視覚要素の強化、画像の歪みの修正、形式間での画像の変換を検討している場合でも、この API は包括的な機能セットを提供します。 Aspose.Imaging.Drawing を使用すると、画像操作を簡単に行うことができ、魅力的で視覚的に美しいグラフィックスをプログラムで作成できるようになります。

フィードバックやご質問については、フォーラム でお知らせください。