我正在尝试将字符串写入文件,我想将字符串居中,以使其在中间。
我到目前为止有此代码:
var title = "My title";
var titleDescription = "My description";
using (var image =
Image.FromFile(
@"path to image")
)
{
var titleLocation = new PointF(image.Width / 2.0f, 30f);
// var titleLocation = new PointF(image.Width / 2.0f - title.Length, 30f);
var titleDescLocation = new PointF(30f, 50f);
using (var graphics = Graphics.FromImage(image))
{
using (Font arialFont = new Font("Arial", 20))
{
graphics.DrawString(title, arialFont, Brushes.Black, titleLocation);
}
using (var arialFont = new Font("Arial", 10))
{
graphics.DrawString(titleDescription, arialFont, Brushes.Black, titleDescLocation);
}
}
image.Save(Application.StartupPath + @"new.jpg", ImageFormat.Jpeg);
}
我希望"标题"的文本以图像为中心。我的代码目前开始从中心写下文本并转到右侧。我需要将其完美地与中心保持一致。
使用 StringFormat.Alignment
:
graphics.DrawString(
title,
arialFont,
Brushes.Black,
new Rectangle(Point.Empty, new Size(image.Width, 100)),
new StringFormat { Alignment = StringAlignment.Center });
您的问题是2倍
-
使用字符串。长度产生多少个字符,而不是字符串在图形方面的宽度。例如,wwww在大多数字体中与IIII的宽度不同。
-
要将一个对象集中在另一个对象中,您将基本对象的大小减去另一个对象的大小,然后将剩余空间划分为两个。例如,如果您的图像为200宽,字符串为100,则您的原始公式将图像分为两个(现在是100(,然后将字符串的宽度拿走,例如100会期望
so
您最终会
var stringSize = graphics.MeasureString(title, arialFont).Width;
var titleLocation = new PointF((image.Width - stringSize) / 2.0f, 30f);
您还应该检查您的字符串小于原始图像大小。.但这将其中心相同。
创建一种称为这样的新方法:
public void CenterString(Graphics g, string text, Font font, Color color, int width, int height)
{
SizeF sizeF = g.MeasureString(text, font);
using (SolidBrush solidBrush = new SolidBrush(color))
{
g.DrawString(text, font, solidBrush, checked(new Point((int)Math.Round(unchecked(width / 2.0 - (sizeF.Width / 2f))), (int)Math.Round(unchecked(height / 2.0 - (sizeF.Height / 2f))))));
}
}
然后您可以这样称呼:
CenterString(graphics, text, font, color, image.Width, image.Height);
我已经尝试过:var stringsize = graphics.measurestring(title,arialfont(.width;然后var titleLocation = new pointf(image.width/2.0f-琴弦,30f(;
您必须这样计算:
var hCenter = (image.Width / 2.0f) - (stringSize/2.0f);