【问题标题】:How to center string in image with graphics?如何将图像中的字符串与图形居中?
【发布时间】:2018-07-29 15:14:09
【问题描述】:

我正在尝试将字符串写入文件,并且我想将字符串居中以使其位于中间。

到目前为止我有这个代码:

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

我希望“标题”的文本在图像中居中。我的代码目前正开始从中心写入文本并向右移动。我需要它与中心完美对齐。

【问题讨论】:

  • 使用 graphics.MeasureString 获取字符串的宽度,而不是字符的长度。 WWWW 与 IIII 不同
  • 有道理,谢谢。我试过这个:var stringSize = graphics.MeasureString(title, arialFont).Width; 然后var titleLocation = new PointF(image.Width / 2.0f - stringSize, 30f); 但它仍然没有居中。我做错了什么?
  • 简单数学。如果你的字符串是 100,而你的图片是 200.. 在你的代码中你刚刚做了 200/2 = 100 所以 (100 - 100) = 0.. 所以它会完全显示在左边。它应该是 50 .. 即 (200-100)/2 例如 (image.Width-stringSize)/2
  • 谢谢你的解释,现在我有点傻了。感谢您的帮助和时间。如果您愿意,请随时发布答案。

标签: c# image graphics bitmap


【解决方案1】:

创建一个像这样调用的新方法:

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

【讨论】:

  • 你有相当多的代码根本没有解释。
  • 好吧,如果我没看错的话,他只是说“我想要”和“我需要”。而不是“如何”。我以为他只是想要一个快速的解决方案。
  • 没错,但请记住,您的答案不只是针对提出问题的人。您的回答应该是整个社区的信息来源。您应该尝试通过解释和记录它的作用,使其成为最佳答案。
【解决方案2】:

我试过这个: var stringSize = graphics.MeasureString(title, arialFont).Width;然后 var titleLocation = new PointF(image.Width / 2.0f - stringSize, 30f);

你必须这样计算:

var hCenter = (image.Width / 2.0f) - (stringSize/2.0f);

【讨论】:

    【解决方案3】:

    你的问题是 2 倍

    1. 使用 String.Length 会产生多少个字符,而不是字符串在图形方面的宽度。在大多数字体中,EG WWWW 的宽度与 IIII 不同。

    2. 要使一个对象在另一个对象中居中,您需要获取基础对象的大小,减去另一个对象的大小,然后将剩余空间一分为二。例如,如果您的图像是 200 宽并且您的字符串是 100,那么您的原始公式将图像一分为二(所以现在是 100)然后将字符串的宽度拿走,例如 100 所以答案是 0 .. 不是我们的 50会期待

    所以

    你最终得到了

    var stringSize = graphics.MeasureString(title, arialFont).Width;
    var titleLocation = new PointF((image.Width - stringSize) / 2.0f, 30f);
    

    您还应该检查您的字符串是否小于原始图像大小..但这将使其居中。

    【讨论】:

      【解决方案4】:

      使用StringFormat.Alignment:

      graphics.DrawString(
          title,
          arialFont,
          Brushes.Black,
          new Rectangle(Point.Empty, new Size(image.Width, 100)),
          new StringFormat { Alignment = StringAlignment.Center });
      

      【讨论】:

        猜你喜欢
        • 2019-05-14
        • 2011-06-25
        • 2013-05-04
        • 2023-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多