我在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,它会从图像中移出一半,旋转中心也会偏离。
如何只在文本中心旋转文字?而不影响图像上的文字位置。
答案 0 :(得分:6)
如果要在图像的中心绘制旋转文本,则将文本的位置偏移文本的测量大小的一半:
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);
答案 1 :(得分: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);
答案 2 :(得分:0)
How to rotate Text in GDI+?有效,但您需要在坐标平面上旋转文本块,其宽度和高度都等于文本块的最长尺寸。坐标平面应位于文本框中间的中心。
如果坐标平面 背景图像,则无效。注意我改变了PointF的值:
grPhoto.DrawString(m_Copyright, //string of text
crFont, //font
myBrush, //Brush
new PointF(xCenterOfText, yPosFromBottomOfText), //Position
StrFormat); //Text alignment
旋转图像与旋转矩阵相同: