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

namespace DsImagingWeb.Demos
{
    // このサンプルは、ビットマップグラフィックの回転変換を使用して、
    // 画像にウォーターマークを角度を付けてレンダリングする方法を示しています。
    public class Watermark2
    {
        public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
        {
            // 注意:単色の背景の代わりに Color.Transparent を使用することも可能ですが、
            // 期待通りに動作させるには、出力される画像フォーマットが透明度をサポートしている
            // 必要があります。
            var backColor = Color.FromArgb(unchecked((int)0xff0066cc));
            var foreColor = Color.FromArgb(unchecked((int)0xffffcc00));
            float angle = -30;
            var rad = (float)(angle * Math.PI) / 180f;

            var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi);
            using (var bmpSrc = new GcBitmap(Path.Combine("Resources", "ImagesBis", "alpamayo-sq.jpg")))
            {
                // BitBlt(ビットブロック転送)を実行するには、両方の画像の不透明度(Opaque)
                // が同じである必要があります。
                bmpSrc.Opaque = opaque;

                // ソース画像をターゲットのビットマップ上に描画します。
                // (通常は最初にソース画像のサイズを変更することが多いですが、今回は
                // ソース画像がターゲットと同じサイズであることがわかっているため、
                // そのステップは省略します)。
                bmp.BitBlt(bmpSrc, 0, 0);
            }

            using (var g = bmp.CreateGraphics())
            {
                // ウォーターマークのテキストを、画像全体にループさせて特定の角度で描画します。
                g.Transform = Matrix3x2.CreateRotation((float)(angle * Math.PI) / 180f, new Vector2(pixelSize.Width / 2, pixelSize.Height / 2));
                var tf = new TextFormat()
                {
                    Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "FreeSansBold.ttf")),
                    FontSize = 14,
                    ForeColor = Color.FromArgb(64, Color.White),

                };
                var tl = g.CreateTextLayout();
                tl.Append("Copyright (c) MESCIUS", tf);
                tl.PerformLayout(true);

                int dx = (int)tl.ContentWidth * 3;
                int dy = (int)tl.ContentHeight * 5;
                int n = 0;
                int offX = -(int)(Math.Cos(rad) * pixelSize.Height / 2); ;
                int offY = (int)(Math.Sin(rad) * pixelSize.Width / 2);

                for (float y = offY; y < pixelSize.Height - offY; y += dy, ++n)
                    for (float x = offX + dx / 2 * (n % 2); x < pixelSize.Width - offX; x += dx)
                        g.DrawTextLayout(tl, new PointF(x, y));
            }
            return bmp;
        }
    }
}