6

我在 C# 中有这段代码来绘制旋转的文本

        Font font = new Font("Arial", 80, FontStyle.Bold);
        int nWidth = pictureBox1.Image.Width;
        int nHeight = pictureBox1.Image.Height;

        Graphics g = Graphics.FromImage(pictureBox1.Image);

        float w = nWidth / 2;
        float h = nHeight / 2;

        g.TranslateTransform(w, h);
        g.RotateTransform(90);

        PointF drawPoint = new PointF(w, h);
        g.DrawString("Hello world", font, Brushes.White, drawPoint);

        Image myImage=new Bitmap(pictureBox1.Image); 

        g.DrawImage(myImage, new Point(0, 0));

        pictureBox1.Image = myImage;
        pictureBox1.Refresh();

如果不旋转,文本将绘制在图像的中心,但使用 RotateTransform,它会超出图像的一半,并且旋转中心会偏离。

如何仅围绕中心旋转文本?不影响图像上的文本位置。

4

3 回答 3

7

如果要在图像的中心绘制旋转的文本,则将文本的位置偏移文本测量大小的一半:

using (Font font = new Font("Arial", 80, FontStyle.Bold))
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
    float w = pictureBox1.Image.Width / 2f;
    float h = pictureBox1.Image.Height / 2f;

    g.TranslateTransform(w, h);
    g.RotateTransform(90);

    SizeF size = g.MeasureString("Hello world", font);
    PointF drawPoint = new PointF(-size.Width / 2f, -size.Height / 2f);
    g.DrawString("Hello world", font, Brushes.White, drawPoint);
}

pictureBox1.Refresh();

(最好在处理完Font对象后处理Graphics它们,所以我添加了一些using语句。)

变体 #1:此代码段将文本的左上角定位在 (400, 200) 处,然后围绕该点旋转文本:

g.TranslateTransform(400, 200);
g.RotateTransform(90);
PointF drawPoint = new PointF(0, 0);
g.DrawString("Hello world", font, Brushes.White, drawPoint);

变体 #2:此代码段将文本的左上角定位在 (400, 200) 处,然后围绕文本中心旋转文本

SizeF size = g.MeasureString("Hello world", font);
g.TranslateTransform(400 + size.Width / 2, 200 + size.Height / 2);
g.RotateTransform(90);
PointF drawPoint = new PointF(-size.Width / 2, -size.Height / 2);
g.DrawString("Hello world", font, Brushes.White, drawPoint);
于 2013-09-13T04:24:30.687 回答
1

当您进行翻译时,您已经在中心,因此您不应在该位置的偏移处绘制文本。

float w = ClientRectangle.Width / 2-50;
float h = ClientRectangle.Height / 2-50;
g.TranslateTransform(w, h);
g.RotateTransform(angle);
PointF drawPoint = new PointF(0, 0);
g.DrawString("Hello world", font, brush, drawPoint);
于 2013-09-13T01:09:02.813 回答
0

如何在 GDI+ 中旋转文本?可以,但是您需要在宽度和高度都等于文本块的最长尺寸的坐标平面上旋转文本块。坐标平面应以文本框的中间为中心。

如果您的坐标平面是背景图像,则它不起作用。请注意,我更改了 PointF 的值:

grPhoto.DrawString(m_Copyright,                 //string of text
                crFont,                         //font
                myBrush,                        //Brush
                new PointF(xCenterOfText, yPosFromBottomOfText),  //Position
                StrFormat);                               //Text alignment

旋转图像与旋转矩阵相同:

http://en.wikipedia.org/wiki/Rotation_matrix

于 2013-09-13T00:27:59.783 回答