使用WPF在C#中创建包含文本的图像并将其保存为.png
我们正在开发一个光学字符识别系统,我想比较不同的渲染器渲染文本的方式。我想做一个简单的程序,创建一个图像,用不同的字体、大小和样式在上面写一些文本,并将其保存到一个.png文件中(我想在一个文件中包含我需要的所有大小、字体样式,以便比较)。我已经设法用GDI和GDI+渲染器使用位图实现了这一点。 现在我正尝试在WPF应用程序中执行相同的操作,因为我听说在WPF中呈现文本是不同的。是否可以使用BitmapImage进行此操作?来自Windows窗体,我认为这个问题应该很简单,但我似乎无法在WPF中实现 这是我使用GDI+渲染器的简化版本:使用WPF在C#中创建包含文本的图像并将其保存为.png,c#,wpf,C#,Wpf,我们正在开发一个光学字符识别系统,我想比较不同的渲染器渲染文本的方式。我想做一个简单的程序,创建一个图像,用不同的字体、大小和样式在上面写一些文本,并将其保存到一个.png文件中(我想在一个文件中包含我需要的所有大小、字体样式,以便比较)。我已经设法用GDI和GDI+渲染器使用位图实现了这一点。 现在我正尝试在WPF应用程序中执行相同的操作,因为我听说在WPF中呈现文本是不同的。是否可以使用BitmapImage进行此操作?来自Windows窗体,我认为这个问题应该很简单,但我似乎无法在WPF中
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有类似的方法吗?使用FormattedText类来构建几何体对象,下面举一个例子: 然后,使用其中一个BitmapEncoder类保存已构建的几何体对象。看看这个例子: 在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);
}
}
谢谢你的回答。这个想法可能行得通。我现在的问题是,我想要一个有很多不同字体和大小的.png,我需要创建很多标签才能做到这一点。此外,当我使用此方法时,.png中呈现的文本与实际运行的应用程序中呈现的文本不同。这可能是由于背景是透明的。有没有一种快速的方法可以将RenderTargetBitmap的背景色设置为白色,或者我必须将每个位都设置为白色?一种方法是,如果使用网格/画布作为UIElement,请尝试将其背景设置为白色。它将工作我改变了背景为白色,但它似乎是背景没有造成不良的文字质量。也许如果它将整个元素渲染到RenderTargetBitmap上,它就不关心先前如何渲染文本。我也尝试在一个标签上使用这种方法,但它仍然不能做到。所以文本质量也取决于分辨率和dpi。您可以安排它们,但文件大小将更大。我将dpi设置为120,以匹配我的系统dpi,并可接受地与原始dpi相似。谢谢你的帮助。