我有一种情况,我想将一些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;
}
答案 0 :(得分:3)
第一
“灰度级回退 - 如果ClearType被禁用或者在某些无法运行ClearType算法的情况下渲染文本,WPF将使用灰度渲染算法来对渲染文本进行抗锯齿。”
将文本渲染到RenderTargetBitmap似乎是其中一种情况....(渲染器从硬件切换到软件路径)。
第二
另外NET 4将默认缩放算法从高质量(Fant)切换到低质量(Bi-Linear).....现在这不应该在这里发挥作用,因为它看起来不像你正在以任何方式缩放位图......但你永远不知道里面发生了什么。可以将缩放器切换回更高质量的缩放器。
第三
您可能需要考虑RichTextBox的父容器...请参阅下面的最后一个链接,提到它可能会扭曲字体呈现。
关于如何解决这个问题的一些想法是:
以更高的分辨率渲染RichTextBox,例如600dpi,然后按比例缩小位图(可能没什么区别)
捕获屏幕....如果你的视觉在屏幕外/模糊等等,很难或不实用。
参见相关链接: