我有一个Win32 Direct2D应用程序,用户可以在其中绘制基元以及加载和操作图片来创建风景。然后,可以将风景打印或另存为PDF文件。
本文解释了打印D2D内容的过程,这也是我如何实现它的:https://docs.microsoft.com/en-us/windows/win32/direct2d/printing-and-command-lists
总之,打印的工作方式是将D2D内容呈现给被设置为ID2D1DeviceContext目标的ID2D1CommandList。在将场景渲染到CommandList之后,我关闭它,将其作为页面添加到ID2D1PrintControl中,关闭ID2D1PrintControl (这会将所有命令发送到打印机),然后恢复我的D2D资源。PDF文件是由相同的过程创建的,但我使用"Microsoft Print to PDF“作为我的打印机。
所有这些作品。然而,当包含大图片时,我注意到生成的PDF文件变得相当大。例如,我将一个4000x3000像素的jpg加载到我的应用程序中(它本身有5MB的文件大小),打印到PDF --> PDF将有28MB,打印作业将需要几秒钟才能完成。在某些机器上,它甚至崩溃(我认为ID2D1PrintControl::AddPage(...)函数或ID2D1PrintControl::Close()函数有时需要花费很长时间才能返回,并且程序不响应。
现在,我知道D2D不能在内部使用像jpg这样的压缩图像,这就是为什么我首先从jpg文件创建ID2D1Bitmap,这也是我在打印时使用的。
问:有没有办法在图像到达打印机之前在D2D中对其进行压缩?我假设我的问题来自于速度慢的机器(?)无法正确处理的大型PrintStreams。我不能缩放图像,因为分辨率很重要!
我意识到也许PDF部分可以通过使用一些PDF创建库和做一些事情来修复,比如使用原始压缩的jpg并将其包含在PDF中,但我真的想避免使用一些PDF库,因为通常PDF打印机工作得很好。
任何对此主题的意见都将不胜感激,因为互联网上确实缺乏关于D2D打印问题的信息。
编辑:我现在已经找到了一种方法,在将图片发送到打印机之前,通过设置较低的DPI并将绘图设置为第二个commandList,以使生成的PDF文件更小。
最后一个仍然存在的问题是,在一些机器上,ID2D1PrintControl::AddPage(...) - function不返回/它冻结了计算机。没有失败,没有成功,当一个人试图打印一个包含多幅图片的复杂风景时。我还没有查看:打印机驱动程序,我可以尝试的所有各种打印机设置,这些机器上的directX版本(可能与此无关)。关于可能导致AddPage函数不返回的原因,有没有人有其他想法?是否有一些典型的安装可能会丢失?可以选择输入为第4和第5个参数的D2D1_TAGs是否有任何意义?
发布于 2020-07-10 00:27:45
现在,我已经找到了一种在将图片发送到打印机之前对其进行光栅化的方法,方法是降低PrintControl的DPI,并使用第二个CommandList来绘制原始图片。然后,我继续对打印作业使用第二个CommandList。将第一个CommandList绘制到第二个会在到达打印机之前强制进行更早且更可控的光栅化,这(取决于设置)会导致较小的PrintStreams。
感谢Simon Mourier的帮助!
https://stackoverflow.com/questions/62594073
复制相似问题