我们正在研究光学字符识别系统,我想比较不同渲染器渲染文本的方式。我想创建一个简单的程序,创建一个图像,用不同的字体,大小和样式写一些文本,并将其保存到.png文件(我希望在一个文件中我需要所有大小,字体样式,所以他们是容易比较)。我已经设法使用Bitmap使用GDI和GDI +渲染器。 现在我正在尝试在WPF应用程序中执行相同的操作,因为我听说渲染文本有所不同。是否可以使用BitmapImage?来自Windows Forms我认为这个问题应该很简单,但我似乎无法在WPF中这样做。
这是我使用GDI + Renderer完成它的简化版本:
public void CreateAndSave()
{
Bitmap bitmap = new Bitmap(500, 500, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bitmap);
g.Clear(Color.White);
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
g.DrawString("sample text", font, brush, x, y);
bitmap.Save(fileName);
}
使用WPF有没有类似的方法?
答案 0 :(得分:1)
诸如“DrawString”之类的方法在WPF中是昂贵的。您可以创建画布/网格并放置文本框或标签等,而不是这样做,然后您可以渲染该画布/网格。您可以使用该代码:
public void ConvertToBitmapSource(UIElement element)
{
var target = new RenderTargetBitmap(
(int)element.RenderSize.Width, (int)element.RenderSize.Height,
96, 96, PixelFormats.Pbgra32);
target.Render(element);
var encoder = new PngBitmapEncoder();
var outputFrame = BitmapFrame.Create(target);
encoder.Frames.Add(outputFrame);
using (var file = File.OpenWrite("TestImage.png"))
{
encoder.Save(file);
}
}
答案 1 :(得分:0)
使用FormattedText类构建Geometry对象,请从此处获取示例: https://msdn.microsoft.com/en-us/library/system.windows.media.formattedtext.buildgeometry(v=vs.110).aspx
然后,使用其中一个BitmapEncoder类来保存您构建的Geometry对象。看看那个例子: https://stackoverflow.com/a/9081295/3730455