2011-10-31 48 views
0

我正在使用图形类的绘图方法在图像上绘制文本。在绘制之前指定字体。如何根据图像大小调整文本大小,同时在C中的图像上绘制字符串#

G.DrawString(mytext, font, brush, 0, 0) 

时相同的文字与绘制较小size.The文本在图像上绘制的问题出现了似乎larger.I'm寻找一个解决方案,根据图像的大小,使得以改变的字体大小在不同尺寸的图像上绘制时,文字不会显得更大或更小。

我用不同大小的图像和绘制在其上的相同字体大小的文字相连。 http://i.stack.imgur.com/ZShUI.jpg

http://i.stack.imgur.com/GUfbM.jpg

我不能直接发布图片,因为我不允许的。

回答

1

你会在各个独立的图像绘制得到最精确的比例然后将该图像拍打到原始图像上。你会做如下:

  1. 创建的内存位图有足够的空间
  2. 在您的默认字体是位图
  3. 绘制文本
  4. 通过将其扩展到尺寸包含文本到原始图像
  5. 绘制图像你需要

代码:最后一行与的

Bitmap textBmp = new Bitmap(100, 100); 
Graphics textBmpG = Graphics.FromImage(textBmp); 
textBmpG .DrawString("test 1", new Font(FontFamily.GenericSansSerif, 16), Brushes.Red, new PointF(0, 0)); 
Graphics origImgG = Graphics.FromImage(originalImg); 
origImgG.DrawImage(textBmpG, new Rectangle(50, 50, 50, 50), new Rectangle(0, 0, 100, 100), GraphicsUnit.Pixel); 

采取通知3210个参数。使用它们将文本位图缩放到原始图像上。或者,您也可以选择Graphics.MeasureString方法来确定您的文本的宽度,并尝试尝试,直到您获得最佳效果。

  1. 使用Graphics.MeasureString()来衡量你的字符串将多大的图像上
  2. 减少/增加字体步步相应

正如你在评论要求我在这里给你更详细的建议。假设您的原始图像宽度为WI1,并且使用Graphics.MeasureString的文本宽度为WT1。如果将图像调整为宽度WI2,那么您的完美文本宽度将为WT2 = WT1 * WI2/WI1。使用DrawText方法可能无法获得此确切宽度,因为当您将字体增加1时,它可能跳过该值。所以你必须做几次尝试并找到最好的。如果生成的文字宽度较小(使用MeasureString测量),选择一种字体大小,将其增大,直到它变得比目标大,并且您有最接近的匹配。同样的事情,如果它太大。逐步缩小字体。

这很快就很脏,因为您看到很多画图,但我想不出更好的解决方案,除非您使用等宽字体。

这些解决方案之间的区别在于,首先您可以获得符合您需要的精确大小的文本,但由于缩放,您可能会失去一些字体可读性。第二种解决方案会提供良好的可读性,但是无法获得像素完美的文本大小。

+0

感谢您的支持。 – techno

+0

如果我使用'Graphics.MeasureString()'来衡量要绘制的字符串的长度和宽度。请给我一个公式来计算要绘制的文本的大小取决于图像的大小。 – techno

+0

我已经添加了对你有用的建议,以便获得正确的字体大小。请注意,没有确切的公式可以做到这一点,因为每个字符在字体中的宽度不同,而且不同字体的宽度相同。 –

0

在我看来,有两种方式:原始图像上

  1. 绘制文本,然后调整产生的图像(因此,包括在它甚至文本)的一个因素newImageWidth/originalImageWidth
  2. 规模字体大小。
    它并不完美,因为你可能有一些问题,文字高度(如果新的图像不只是缩放,但不同的纵横比),但它是一个想法
相关问题