【发布时间】:2011-09-27 10:50:17
【问题描述】:
我正在尝试使用 WPF 转换 XPS。
想法是这些图像可以用silverlight 4加载,为此我使用以下代码:
// XPS Document
XpsDocument xpsDoc = new XpsDocument(xpsFileName, System.IO.FileAccess.Read);
FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence();
// The number of pages
PageCount = docSeq.References[0].GetDocument(false).Pages.Count;
DocumentPage sizePage = docSeq.DocumentPaginator.GetPage(0);
PageHeight = sizePage.Size.Height;
PageWidth = sizePage.Size.Width;
// Scale dimensions from 96 dpi to 600 dpi.
double scale = 300/ 96;
// Convert a XPS page to a PNG file
for (int pageNum = 0; pageNum < PageCount; pageNum++)
{
DocumentPage docPage = docSeq.DocumentPaginator.GetPage(pageNum);
BitmapImage bitmap = new BitmapImage();
RenderTargetBitmap renderTarget =
new RenderTargetBitmap((int)(scale * (docPage.Size.Height + 1)),
(int)(scale * (docPage.Size.Height + 1)),
scale * 96,
scale * 96, PixelFormats.Pbgra32);
renderTarget.Render(docPage.Visual);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTarget));
FileStream pageOutStream = new FileStream(name + ".Page" + pageNum + ".png", FileMode.Create, FileAccess.Write);
encoder.Save(pageOutStream);
pageOutStream.Close();
此代码取自http://xpsreader.codeplex.com/ 一个用于转换 XPS 文档的项目。 效果很好! 但问题是图像分辨率低且模糊。 我研究并发现 RenderTargetBitmap 并在此页面上找到: http://www.codeproject.com/Questions/213737/Render-target-bitmap-quality-issues
这里的问题是你有没有使用硬件 RenderTargetBitmap 渲染。
一种解决方案是使用 DirectX 和 WPF 来执行此操作,但没有找到任何明确的示例来向我展示正确的方法。
感谢您的建议。提前致谢。
更新:我附上了XPS文档,我正在尝试转换图像 Please download test.xps
【问题讨论】:
-
您正在尝试以 1800 dpi 进行渲染。这完全是矫枉过正 - 任何超过 300 dpi 的东西都会过分,除非你打算在屏幕上放大。
-
你是对的,300 dpi 只是在尝试不同的值有什么建议吗?
-
如果你愿意离线(和跨平台),那么你可以使用ghostscript,它在以后的版本中支持xps。见:ghostscript.com/GPL_Ghostscript_8.61.html
-
您是否有用于生成模糊图像的示例 xps 文档?我得到了很好的清晰图像。
-
是的,我附上了文件!。谢谢。
标签: c# wpf silverlight xps rendertargetbitmap