我正在使用WPF开发一个应用程序来动态呈现内容,包括从WPF到jpg文件的文本和图像。我目前正在使用RenderTargetBitmap
类来完成这项工作。一切都按预期工作,但渲染字体的质量很糟糕。我知道RenderTargetBitmap
不使用ClearType,而是使用GrayScale antialias,这是一种带有小字体的blury。但我使用大于30磅的大字体,结果是完全不可接受的。这个问题有什么解决方法吗?
[更新]
我正在使用的代码如下所示。正如预期的那样,它会在CompositionTarget的每个Rendering事件中调用。
void CompositionTarget_Rendering(object sender, EventArgs e)
{
prefix = "";
if (counter < 10)
{
prefix = "000";
}
else if (counter < 100)
{
prefix = "00";
}
else if (counter < 1000)
{
prefix = "0";
}
Size size = new Size(MainCanvas.Width, MainCanvas.Height);
MainCanvas.Measure(size);
MainCanvas.Arrange(new Rect(size));
RenderTargetBitmap bmp = new RenderTargetBitmap(imgWidth, imgHeight, 96d, 96d, PixelFormats.Default);
bmp.Render(MainCanvas);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 90;
encoder.Frames.Add(BitmapFrame.Create(bmp));
string file = basePath + prefix + counter.ToString() + "_testpic.jpg";
using (Stream stm = File.Create(file))
{
encoder.Save(stm);
}
counter++;
}
以下是生成图像的一些示例: alt text http://www.randomnoise.org/temp/testpic_v1.jpg alt text http://www.randomnoise.org/temp/testpic_v2.jpg
提前致谢。
答案 0 :(得分:0)
试试这个:
int height = (int)border.ActualHeight;
int width = (int)border.ActualWidth;
RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(border);
border正在尝试保存为位图。
答案 1 :(得分:0)
好的,我终于找到了解决方案。古斯塔沃,你走在正确的轨道上。问题是我试图呈现为位图的主容器被其父容器扭曲了。解决方案是将主容器添加到画布中,该画布没有使其子项扭曲的布局引擎。我仍然需要做更多的实验,但看起来很有希望。显然RenderTargetBitmap根本不喜欢扭曲的字体。