PushClip.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 GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Imaging;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
namespace DsImagingWeb.Demos
{
// このサンプルでは、GcGraphics.PushClip/PopClip メソッドを使用してクリッピングを指定する方法を示します。
public class PushClip
{
public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
{
var backColor = Color.LightGray;
var foreColor = Color.DarkRed;
float cw = 400, ch = 300, pad = 40, bord = 4, textpad = 10;
var clipRc = new RectangleF(pad, pixelSize.Height - ch - pad, cw, ch);
var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi);
using (var g = bmp.CreateGraphics(backColor))
{
// 2つのネストされた長方形からなるパスを作成します。
// 外側の長方形はビットマップ全体、内側の長方形はテキストボックスです。
// 次に、このパスを使用してクリップ領域を作成し、
// テキストボックスを除くビットマップ全体を覆う画像を描画します。
using (var gpath = g.CreatePath())
{
gpath.BeginFigure(PointF.Empty);
gpath.AddLine(new PointF(pixelSize.Width, 0));
gpath.AddLine(new PointF(pixelSize.Width, pixelSize.Height));
gpath.AddLine(new PointF(0, pixelSize.Height));
gpath.EndFigure(FigureEnd.Closed);
gpath.BeginFigure(new PointF(clipRc.Left, clipRc.Top));
gpath.AddLine(new PointF(clipRc.Right, clipRc.Top));
gpath.AddLine(new PointF(clipRc.Right, clipRc.Bottom));
gpath.AddLine(new PointF(clipRc.Left, clipRc.Bottom));
gpath.EndFigure(FigureEnd.Closed);
using (var cliprgn = g.CreateClipRegion(gpath))
using (var img = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "clivia.jpg")))
{
g.PushClip(cliprgn);
g.DrawImage(
img,
new RectangleF(0, 0, pixelSize.Width, pixelSize.Height),
null,
ImageAlign.StretchImage);
g.PopClip(cliprgn);
}
}
// テキストボックス内にテキストを描画します。
// テキストボックスの範囲でクリッピングを行います。
// PushClipのこのオーバーロードは、破棄される時にクリッピングを解除するIDisposableオブジェクトを返します。
using (g.PushClip(clipRc))
{
clipRc.Inflate(-textpad, -textpad);
g.DrawString(
Common.Util.LoremIpsum(1, 3, 4, 10, 20),
new TextFormat()
{
Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "FreeSerif.ttf")),
FontSize = 16,
ForeColor = foreColor
},
clipRc
);
}
// 画像全体を囲む境界線を描画します。
// これにより、クリップ領域が正常に解除されていることを確認できます。
g.DrawRectangle(
new RectangleF(bord / 2, bord / 2, pixelSize.Width - bord, pixelSize.Height - bord),
new GCDRAW.Pen(foreColor, bord));
}
// 画像ファイルを保存します。
return bmp;
}
}
}