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();

( FontandGraphicsオブジェクトは使い終わったら破棄することをお勧めします。そのため、いくつかの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 に答える