Gradients.cs
// 
// このコードは、DioDocs for Imaging のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Imaging;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace DsImagingWeb.Demos
{
    // ​​LinearGradientBrush と RadialGradientBrush を使用してグラデーション塗りつぶしを作成する方法を示します。
    public class Gradients
    {
        public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
        {
            var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, true, dpi, dpi);
            var Inch = dpi;
            using (var g = bmp.CreateGraphics(Color.RoyalBlue))
            {
                var testRectSize = new SizeF(Inch * 6, Inch);
                var dy = Inch / 6;
                // ラベルを描画するためのテキストレイアウトを作成します。
                var tl = g.CreateTextLayout();
                tl.DefaultFormat.FontSize = Inch / 6;
                tl.DefaultFormat.ForeColor = Color.Chartreuse;
                tl.MaxWidth = testRectSize.Width;
                tl.MaxHeight = testRectSize.Height;
                tl.TextAlignment = TextAlignment.Center;
                tl.ParagraphAlignment = ParagraphAlignment.Center;
                // 注釈 1
                var rc = Common.Util.AddNote("Linear gradients using LinearGradientBrush:", g, new RectangleF(Inch, Inch / 2, 500, 100));
                // テキストの挿入ポイントを設定します。
                PointF ip = new PointF(rc.Left, rc.Bottom + dy);
                // グラデーションで塗りつぶされた矩形を描画するためのローカルアクションです。
                Action<GrapeCity.Documents.Drawing.Brush, string> drawSwatch = (b_, txt_) =>
                {
                    var rect = new RectangleF(ip, testRectSize);
                    // 矩形をグラデーションブラシで塗りつぶします。
                    g.FillRectangle(rect, b_);
                    // 枠線やテキスト情報などを描画します。
                    g.DrawRectangle(rect, Color.Magenta);
                    tl.Clear();
                    tl.Append(txt_);
                    tl.MaxHeight = testRectSize.Height;
                    tl.MaxWidth = testRectSize.Width;
                    tl.PerformLayout(true);
                    g.DrawTextLayout(tl, ip);
                    ip.Y += rect.Height + dy;
                };
                // LinearGradientBrush
                // 水平方向のグラデーションを描画します。
                LinearGradientBrush linearGradBrush = new LinearGradientBrush(Color.Red, Color.Blue);
                drawSwatch(linearGradBrush, $"Linear gradient\nfrom {linearGradBrush.StartPoint} to {linearGradBrush.EndPoint}");
                // 垂直方向のグラデーションを描画します。
                linearGradBrush = new LinearGradientBrush(Color.Red, new PointF(0, 0), Color.Green, new PointF(0, 1));
                drawSwatch(linearGradBrush, $"Linear gradient\r\nfrom {linearGradBrush.StartPoint} to {linearGradBrush.EndPoint}");
                // 斜め方向のグラデーション(対角線を見やすくするためにスウォッチの高さを2倍にします)。
                testRectSize.Height *= 2;
                linearGradBrush = new LinearGradientBrush(Color.Red, new PointF(0, 0), Color.Teal, new PointF(1, 1));
                drawSwatch(linearGradBrush, $"Linear gradient\r\nfrom {linearGradBrush.StartPoint} to {linearGradBrush.EndPoint}");
                // RadialGradientBrush
                rc = Common.Util.AddNote("Radial gradients using RadialGradientBrush:", g, new RectangleF(ip, new SizeF(500, 100)));
                ip.Y = rc.Bottom + dy;
                // 中央に配置する場合
                // testRectSize.Height *= 2;
                RadialGradientBrush radialGradBrush = new RadialGradientBrush(Color.Orange, Color.Purple);
                drawSwatch(radialGradBrush, $"Radial gradient\r\nwith origin at {radialGradBrush.GradientOrigin}");
                // 中心を右下隅に配置する場合
                radialGradBrush = new RadialGradientBrush(Color.OrangeRed, Color.DarkBlue, new PointF(1, 1));
                drawSwatch(radialGradBrush, $"Radial gradient\r\nwith origin at {radialGradBrush.GradientOrigin}");
            }
            // 画像ファイルを保存します。
            return bmp;
        }
    }
}