Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用WPF在C#中创建包含文本的图像并将其保存为.png_C#_Wpf - Fatal编程技术网

使用WPF在C#中创建包含文本的图像并将其保存为.png

使用WPF在C#中创建包含文本的图像并将其保存为.png,c#,wpf,C#,Wpf,我们正在开发一个光学字符识别系统,我想比较不同的渲染器渲染文本的方式。我想做一个简单的程序,创建一个图像,用不同的字体、大小和样式在上面写一些文本,并将其保存到一个.png文件中(我想在一个文件中包含我需要的所有大小、字体样式,以便比较)。我已经设法用GDI和GDI+渲染器使用位图实现了这一点。 现在我正尝试在WPF应用程序中执行相同的操作,因为我听说在WPF中呈现文本是不同的。是否可以使用BitmapImage进行此操作?来自Windows窗体,我认为这个问题应该很简单,但我似乎无法在WPF中

我们正在开发一个光学字符识别系统,我想比较不同的渲染器渲染文本的方式。我想做一个简单的程序,创建一个图像,用不同的字体、大小和样式在上面写一些文本,并将其保存到一个.png文件中(我想在一个文件中包含我需要的所有大小、字体样式,以便比较)。我已经设法用GDI和GDI+渲染器使用位图实现了这一点。 现在我正尝试在WPF应用程序中执行相同的操作,因为我听说在WPF中呈现文本是不同的。是否可以使用BitmapImage进行此操作?来自Windows窗体,我认为这个问题应该很简单,但我似乎无法在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有类似的方法吗?

使用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相似。谢谢你的帮助。