文字を回転や拡大を施して描画する

System.Drawing.Graphics オブジェクトに対してアフィン変換を適用すると、拡大/縮小、せん断(スキュー)、回転、平行移動を施すことができます。 これには、System.Drawing.Drawing2D.Matrix クラスを使います。以下の例は、「縁取り文字を描きたい」の例に対して、さらに横方向の拡大と回転を施したものです。
※ アフィン変換は、そうれぞれの操作の適用順番が重要です。たとえば、拡大してから回転と、回転してから拡大では結果が異なります。


■ 処理コード
string text = "こんにちは !";
Bitmap bitmap = new Bitmap(512, 200);
Graphics g = Graphics.FromImage(bitmap);
g.SmoothingMode = SmoothingMode.AntiAlias;

Matrix matrix = new Matrix();
matrix.Scale(1.5f, 1.0f, MatrixOrder.Append);
matrix.RotateAt(-15, new PointF(200, 40), MatrixOrder.Append);
g.Transform = matrix;

GraphicsPath path = new GraphicsPath();
path.AddString(text, new FontFamily("メイリオ"), (int)FontStyle.Bold, 64, new Point(0, 60), StringFormat.GenericTypographic);
LinearGradientBrush innerBrush = new LinearGradientBrush(new Point(0, 0), new Point(400, 0), Color.Red, Color.Blue);
ColorBlend colorBlend = new ColorBlend(3);
Color[] colors = { Color.Red, Color.Green, Color.Blue };
float[] positions = { 0.0f, 0.5f, 1.0f };
colorBlend.Colors = colors;
colorBlend.Positions = positions;
innerBrush.InterpolationColors = colorBlend;
g.FillPath(innerBrush, path);
g.DrawPath(new Pen(Brushes.Black, 2), path);
g.Dispose();
pictureBox.Image = bitmap;