使用WPF在C#中创建带有文本的图像并将其保存为.png格式

4
我们正在开发一款光学字符识别系统,我想比较不同渲染器如何呈现文本。我想编写一个简单的程序来创建一个图像,在图像上使用不同字体、大小和风格写入一些文本,并将其保存为.png文件(我希望所有需要的大小、字体样式都在一个文件中,以便于比较)。我已经使用Bitmap成功地实现了GDI和GDI+渲染器。现在,我正在尝试在WPF应用程序中做同样的事情,因为我听说那里呈现文本是不同的。是否可以使用BitmapImage来实现?来自Windows Forms的我认为这个问题应该很简单,但我似乎在WPF中无法做到。下面是使用GDI+渲染器的简化版本:
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中实现这个功能?
2个回答

3

比如在WPF中,像 "DrawString" 这样的方法是很耗费资源的。相反,你可以创建一个画布/网格并放置文本框或标签等,然后渲染该画布/网格。你可以使用以下代码:

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
谢谢你的回答。这个想法可能行得通。我现在遇到的问题是,我想要一个包含许多不同字体和大小的 .png 文件,而我必须创建很多标签才能做到这一点。此外,当我使用这种方法时,在 .png 中呈现的文本与实际运行的应用程序中的文本不同。这可能是由于背景是透明的原因。有没有快速设置 RenderTargetBitmap 的背景颜色为白色的方法,或者我必须将每个位都设置为白色? - Kuczi
一种方法是,如果您将网格/画布用作UIElement,请尝试将其背景设置为白色。这将起作用。 - Ugur
我把背景改成了白色,但似乎背景并没有导致文本质量不佳。也许如果将整个元素渲染到RenderTargetBitmap上,它就不会关心之前的文本是如何渲染的。我还尝试在单个标签上使用此方法,但仍然无效。 - Kuczi
我将dpi设置为120以匹配我的系统dpi,与原始文本相似度可以接受。谢谢你的帮助。 - Kuczi
我还有一个问题。在RenderTargetBitmap上,是否可以设置元素的渲染位置? - Kuczi
显示剩余4条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接