我有一些区域(矩形)的文字图像。文本可以是任何长度,一个字或长字符串(必须包装)。我需要:(!带包装)WPF的第三方允许在矩形中绘制包裹文本?
- 计算字体大小(用字符串,字体和矩形)在这个矩形
- 绘制文本
主要的要求:得到最大的字体大小的,在文字应填充所有矩形。
我做了什么。 我在NuGet中找到了不错的第三方:ImageProcessor。但是,ImageFactory.Watermark只获取起点,而不是矩形。
OK,我实现了自己的解决方案:
- 尝试绘制矩形中的文本具有非常大的字体大小(使用MeasureText,不是真正的渲染)。
- 例如,我的矩形有height = 100,但MeasureString返回200.很好,将fontSize从50更改为25.
- 随着新的fontSize每个字符变得更小,不仅高度和宽度太!这就是为什么我更换newFontSize = oldFontSize *(是measuredHeight/requiredHeight)到newFontSize = oldFontSize * Math.Sqrt(是measuredHeight/requiredHeight)
- 看起来更好。但我仍然有问题。
问题1:我使用WPF中GDI +的Graphics.MeasureString。这不是线程安全的,我必须使用锁。
问题2:MeasureString返回错误的高度,就好像文本有很大的空白。例如,我有3个矩形接近对方:
- RECTANGLE1
- RECTANGLE2
- RECTANGLE3
渲染后,我看到他们之间非常大的空间。
我会很高兴得到我需要的第三方!如果不是,修复我的代码也会很棒。谢谢!
代码:
private static void RenderText(string text, RectangleF rectangle,
string fontFamily, int maximumFontSize, Color textColor, Graphics graphics)
{
var font = new Font(fontFamily, maximumFontSize, FontStyle.Regular);
var stringFormat = new StringFormat
{
// LineAlignment = StringAlignment.Center,
FormatFlags = StringFormatFlags.NoClip | StringFormatFlags.FitBlackBox,
Trimming = StringTrimming.None
};
var previewSize = graphics.MeasureString(text, font,
new SizeF(rectangle.Width, rectangle.Height), stringFormat);
if (previewSize.Height > rectangle.Height)
{
var scale = Math.Sqrt(rectangle.Height/previewSize.Height);
font = new Font(fontFamily, (float) (maximumFontSize * scale), FontStyle.Regular);
}
graphics.DrawString(text, font, new SolidBrush(textColor), rectangle, stringFormat);
}
附加说明:
我试图让这个是在同一时间两个文本换行和字体缩放。以this sketch为例。
呜..为什么到GDI和MeasureText和手动呈现?你能否简短解释一下,为什么你不能在边框中使用标准的基本TextBlock(使用给定的字体)(使用颜色作为矩形)并将其渲染为图像(然后将该图像用作水印)?如果你有使用自定义字体的问题 - > ie:http://stackoverflow.com/questions/3765647/using-a-custom-font-in-wpf – quetzalcoatl
因为这是渲染器,这个应用程序获取一些基本的图像与2个矩形(哪里应该是文本),2个字符串和新的图像大小。我必须调整图像大小,在图像上绘制文本,然后将此图像保存为jpg。用户在用户界面中看不到包含文字的图像。 – TimeCoder
此外!即使所有这些都发生在UI中:我如何使用TextBlock?文字可以有任意长度,我必须更改FontSize。 WPF控件可以打包文本,但TextBlock如何用文本(var长度)填充控件的固定高度? – TimeCoder