0

我有一种情况,我想将一些 XAML 转换为图像,所以我创建了一个 RichTextBox,然后拍摄了它的图像。现在的问题是图像中的文字模糊不清,知道我该如何解决吗?

public System.Drawing.Bitmap ConvertXamltoImage(string XamlString, int Width, int Height)
{

    RichTextBox AdContentRichTextBox = new RichTextBox() { Width = Width, Height = Height };
    AdContentRichTextBox.BorderThickness = new Thickness(0);
    XmlReader _XmlReader = XmlReader.Create(new StringReader(XamlString));

    AdContentRichTextBox.Document = XamlString;          

    var size = new Size(Width, Height);
    AdContentRichTextBox.Measure(size);
    AdContentRichTextBox.Arrange(new Rect(size));
    RenderTargetBitmap bmp = new RenderTargetBitmap(Width, Height, 300, 300, PixelFormats.Pbgra32);

    bmp.Render(AdContentRichTextBox);


    DrawingVisual _drawingVisual = new DrawingVisual();

    using (DrawingContext _drwaingContext = _drawingVisual.RenderOpen())
    {
        VisualBrush _visualBrush = new VisualBrush(AdContentRichTextBox);
    }

    PngBitmapEncoder _png = new PngBitmapEncoder();

    _png.Frames.Add(BitmapFrame.Create(bmp));
    System.Drawing.Bitmap _tempBitmap = null;
    using (Stream _fileStream = new MemoryStream())
    {
        _png.Save(_fileStream);
        _tempBitmap = new System.Drawing.Bitmap(_fileStream);

        _fileStream.Flush();
    }
    return _tempBitmap;
}
4

1 回答 1

4

嗯..这里可能有很多东西都在相互作用:

第一

“灰度回退 - 如果 ClearType 被禁用或在某些情况下无法运行 ClearType 算法呈现文本,WPF 将使用灰度呈现算法对呈现的文本进行抗锯齿处理。”

将文本渲染到 RenderTargetBitmap 似乎是其中一种情况......(渲染器从硬件切换到软件路径)。

第二

此外,NET 4 将默认缩放算法从高质量 (Fant) 切换为低质量 (Bi-Linear)……现在这不应该在这里发挥作用,因为它看起来不像是在缩放任何方式的位图......但你永远不知道里面发生了什么。可以将缩放器切换回更高质量的缩放器。

第三

您可能需要考虑 RichTextBox 的父容器...请参阅下面的最后一个链接,提到它会扭曲字体渲染。


关于如何解决这个问题的一些想法是:

  1. 以更高的分辨率渲染 RichTextBox,例如 600dpi,然后按比例缩小位图(可能没有区别)

  2. 捕获屏幕....如果您的视觉在屏幕外/被遮挡等,困难或不实用。


查看相关链接:

于 2012-08-03T22:05:07.093 回答