简体   繁体   English

在DrawingContext中以一定角度绘制文本?

[英]DrawText at an angle in DrawingContext?

So I am using the following code to take an existing image, text from an input form, and then place the text from the input form onto the existing image and save it as a new image: 所以我使用以下代码从输入表单中获取现有图像,文本,然后将输入表单中的文本放到现有图像上并将其另存为新图像:

using (FileStream output = new FileStream(match_outputFile, FileMode.Create))
{
    BitmapImage bitmap = new BitmapImage(new Uri(match_sourceFile, UriKind.Relative));
    DrawingVisual visual = new DrawingVisual();

    using (DrawingContext image = visual.RenderOpen())
    {
        image.DrawImage(bitmap, new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));

        buildText(image, "text1", this.text1.Text);
        buildText(image, "text2", this.text2.Text);
        buildText(image, "text3", this.text3.Text);
    }

    RenderTargetBitmap target = new RenderTargetBitmap(bitmap.PixelWidth, bitmap.PixelHeight, bitmap.DpiX, bitmap.DpiY, PixelFormats.Default);
    target.Render(visual);

    BitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(target));
    encoder.Save(output);
}

As you can see, it calls the following function to draw the text: 如您所见,它调用以下函数来绘制文本:

private void buildText(DrawingContext image, string settings, string input)
{
    string[] setting = (Properties.Settings.Default[settings].ToString()).Split(',');

    FormattedText text = new FormattedText(
        input,
        System.Globalization.CultureInfo.InvariantCulture,
        FlowDirection.LeftToRight,
        new Typeface(new FontFamily(setting[0]), FontStyles.Normal, FontWeights.Bold, FontStretches.Normal),
        Convert.ToDouble(setting[5]),
        (Brush) new BrushConverter().ConvertFromString(setting[4])
    );
    text.MaxTextWidth = Convert.ToDouble(setting[8]);
    text.MaxTextHeight = Convert.ToDouble(setting[9]);

    Point position = new Point(Convert.ToDouble(setting[7]), Convert.ToDouble(setting[6]));

    switch (setting[2])
    {
        case "center": position.X += (Convert.ToDouble(setting[8]) - text.Width) / 2; break;
        case "right": position.X += Convert.ToDouble(setting[8]) - text.Width; break;
    }

    switch (setting[3])
    {
        case "middle": position.Y += (Convert.ToDouble(setting[9]) - text.Height) / 2; break;
        case "bottom": position.Y += Convert.ToDouble(setting[9]) - text.Height; break;
    }

    image.DrawText(text, position);
}

Now what I need is simple... I need to draw text2 (and ONLY text2) at an ANGLE from the center position. 现在我需要的是简单的...我需要从中心位置在ANGLE处绘制text2(和ONLY text2)。 The center position is simple, it would be: 中心位置很简单,它将是:

centerX = (setting[8] - setting[7]) / 2;
centerY = (setting[9] - setting[6]) / 2;

So what if I wanted to draw this text, at a -30 degree angle rotated at the center position? 那么,如果我想绘制这个文本,在中心位置旋转-30度角怎么办? Remember I want ONLY text 2 rotated, not the other text, and not the original image source either. 请记住,我只想要旋转文本2,而不是其他文本,而不是原始图像源。

You could simply push a RotateTransform onto the DrawingContext before drawing the text. 您可以在绘制文本之前 RotateTransform 送到DrawingContext上。 After drawing, pop the transform. 绘制后, 弹出转换。

buildText(image, "text1", this.text1.Text);
image.PushTransform(new RotateTransform(angle, centerX, centerY));
buildText(image, "text2", this.text2.Text);
image.Pop();
buildText(image, "text3", this.text3.Text);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM