Как нарисовать вращаемую строку с высоким качеством в C #? - PullRequest
0 голосов
/ 19 декабря 2011

Я хочу нарисовать строку и повернуть ее под произвольным углом. Я просто вычисляю новые размеры области, в которой находится повернутое изображение, затем создаю растровый объект и с помощью графического объекта на нем рисую строку с 3 преобразованиями (перевод в центр, поворот и обратный перевод). Я написал следующий код, но качество не желательно. У кого-нибудь есть идея?

    private Image RotateText(string Text, int FontSize, float Angle)
    {

        //Modify angle
        Angle *= -1;

        //Calculate rotation angle in radian
        double AngleInRadian = (Angle * 2 * Math.PI) / 360d;

        //Instantiate a font for text
        Font TextFont = new Font("Tahoma", FontSize, FontStyle.Bold);

        //Measure size of the text
        Graphics Graphic = this.CreateGraphics();
        SizeF TextSize = Graphic.MeasureString(Text, TextFont);

        //Calculate size of the rotated text
        double NewWidth  = Math.Abs(TextSize.Width * Math.Cos(AngleInRadian)) + Math.Abs(TextSize.Height * Math.Sin(AngleInRadian));
        double NewHeight = Math.Abs(TextSize.Width * Math.Sin(AngleInRadian)) + Math.Abs(TextSize.Height * Math.Cos(AngleInRadian));

        //Instantiate a new image for rotated text
        Bitmap RotatedText = new Bitmap((int)(Math.Round(NewWidth)), (int)(Math.Round(NewHeight)));

        //Get graphic object of new isntantiated image for painting
        Graphics TextGraphic = Graphics.FromImage(RotatedText);
        TextGraphic.InterpolationMode = InterpolationMode.High;

        //Calcaute coordination of center of the image
        float OX = (float)NewWidth  / 2f;
        float OY = (float)NewHeight / 2f;

        //Apply transformations (translation, rotation, reverse translation)
        TextGraphic.TranslateTransform(OX, OY);
        TextGraphic.RotateTransform(Angle);
        TextGraphic.TranslateTransform(-OX, -OY);

        //Calculate the loaction of drawing text
        float X = (RotatedText.Width  - TextSize.Width ) / 2f;
        float Y = (RotatedText.Height - TextSize.Height) / 2f;

        //Draw the string
        TextGraphic.DrawString(Text, TextFont, Brushes.White, X, Y);

        //Return the image of rotated text
        return RotatedText;

    }

Результат таков:

enter image description here

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

Попробуйте установить для свойства TextRenderingHint объекта Graphics значение AntiAlias

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.textrenderinghint.aspx

0 голосов
/ 19 декабря 2011

Вы можете попробовать несколько вещей:

  • В вашем XAML:

    TextOptions.TextFormattingMode = "Display" (и другие вложенные свойства TextOptions)

  • В вашем C #:

    TextOptions.SetTextFormattingMode (this, TextFormattingMode.Display);

  • Взгляните на эту ТАКУЮ тему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...