Reputation: 14800
I have this code in C# to draw the rotated text
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();
without rotate the text is drawn on the center of image, but with RotateTransform it goes half out of the image and the rotation center is way off.
How can I rotate the text only arount it's center ? without affecting the text position on the image.
Upvotes: 6
Views: 11577
Reputation: 55509
If you want to draw rotated text at the center of the image, then offset the location of the text by half the measured size of the text:
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();
(It's a good idea to dispose of Font
and Graphics
objects when you're done with them, so I've added a couple using
statements.)
Variation #1: This snippet positions the upper-left corner of the text at (400, 200) and then rotates the text around that point:
g.TranslateTransform(400, 200);
g.RotateTransform(90);
PointF drawPoint = new PointF(0, 0);
g.DrawString("Hello world", font, Brushes.White, drawPoint);
Variation #2: This snippet positions the upper-left corner of the text at (400, 200) and then rotates the text around the center of the text:
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);
Upvotes: 7
Reputation: 269
When you do the translate, you are already at the center, so you should not draw your text at an offset of that location.
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);
Upvotes: 1
Reputation: 1506
How to rotate Text in GDI+? works, but you need to rotate the text block on a coordinate plane whose width and height are both equal to the longest dimension of the block of text. The coordinate plane should be centered on the middle of the text box.
It doesn't work if your coordinate plane is the background image. Notice I changed the values of PointF:
grPhoto.DrawString(m_Copyright, //string of text
crFont, //font
myBrush, //Brush
new PointF(xCenterOfText, yPosFromBottomOfText), //Position
StrFormat); //Text alignment
Rotating an image is the same thing as rotating a matrix:
http://en.wikipedia.org/wiki/Rotation_matrix
Upvotes: 0