我有一个Win32 Direct2D应用程序,用户可以绘制基本图形并加载和操作图片以创建场景。之后,场景可以打印或保存为PDF文件。
这篇文章解释了打印D2D内容的过程,也是我实现的方式:https://learn.microsoft.com/en-us/windows/win32/direct2d/printing-and-command-lists 总之,打印通过将D2D内容渲染到ID2D1CommandList中实现,该列表被设置为ID2D1DeviceContext的目标。在将场景渲染到CommandList之后,我关闭它,将其作为页面添加到ID2D1PrintControl中,关闭ID2D1PrintControl(这会将所有命令发送给打印机),然后恢复我的D2D资源。 PDF文件使用相同的过程创建,但我使用“Microsoft Print to PDF”作为我的打印机。
所有这些都可以。然而,当包含大图片时,我注意到生成的PDF文件变得非常大。例如,我将一个4000 x 3000像素的jpg加载到我的应用程序中(本身有5 MB文件大小),打印成PDF -> 然后PDF将有28 MB,并且打印作业需要几秒钟才能完成。在某些机器上,它甚至会崩溃(我认为ID2D1PrintControl :: AddPage(...)函数或ID2D1PrintControl :: Close()函数有时需要很长时间才能返回,程序无响应)。
现在,我知道D2D不能在内部使用压缩图像,这就是为什么我首先从jpg文件创建ID2D1Bitmap的原因,这也是我打印时所使用的内容。
问题:是否有任何方法可以在D2D中压缩图像,使其在到达打印机之前进行压缩?我假设我的问题来自无法由慢速机器正确处理的大型PrintStreams(?)。我无法缩放图像,因为分辨率很重要!
我意识到,使用一些PDF创建库并执行诸如使用原始压缩的jpg并将其包含在PDF中之类的操作可能可以修复PDF部分,但通常情况下PDF打印机运行良好,我真的想避免使用一些PDF库。
任何关于D2D打印问题的意见都将不胜感激,因为互联网上真的缺乏相关信息。
编辑:我现在找到了一种方法,在发送图片到打印机之前对其进行光栅化,通过将DPI设置较低并绘制到第二个命令列表中使结果PDF文件更小。
最后一个问题是,在某些机器上,ID2D1PrintControl :: AddPage(...)-函数根本不返回/冻结计算机。没有失败,也没有成功,无论何时尝试打印具有多张图片的复杂场景。我还需要研究:打印机驱动程序,我可以尝试的所有各种打印机设置,这些机器上的directX版本(可能与此无关)。是否有任何其他想法可以导致AddPage函数不返回?是否有任何可能缺失的典型安装?可选输入作为第4和第5个参数的D2D1_TAG是否具有任何重要性?
这篇文章解释了打印D2D内容的过程,也是我实现的方式:https://learn.microsoft.com/en-us/windows/win32/direct2d/printing-and-command-lists 总之,打印通过将D2D内容渲染到ID2D1CommandList中实现,该列表被设置为ID2D1DeviceContext的目标。在将场景渲染到CommandList之后,我关闭它,将其作为页面添加到ID2D1PrintControl中,关闭ID2D1PrintControl(这会将所有命令发送给打印机),然后恢复我的D2D资源。 PDF文件使用相同的过程创建,但我使用“Microsoft Print to PDF”作为我的打印机。
所有这些都可以。然而,当包含大图片时,我注意到生成的PDF文件变得非常大。例如,我将一个4000 x 3000像素的jpg加载到我的应用程序中(本身有5 MB文件大小),打印成PDF -> 然后PDF将有28 MB,并且打印作业需要几秒钟才能完成。在某些机器上,它甚至会崩溃(我认为ID2D1PrintControl :: AddPage(...)函数或ID2D1PrintControl :: Close()函数有时需要很长时间才能返回,程序无响应)。
现在,我知道D2D不能在内部使用压缩图像,这就是为什么我首先从jpg文件创建ID2D1Bitmap的原因,这也是我打印时所使用的内容。
问题:是否有任何方法可以在D2D中压缩图像,使其在到达打印机之前进行压缩?我假设我的问题来自无法由慢速机器正确处理的大型PrintStreams(?)。我无法缩放图像,因为分辨率很重要!
我意识到,使用一些PDF创建库并执行诸如使用原始压缩的jpg并将其包含在PDF中之类的操作可能可以修复PDF部分,但通常情况下PDF打印机运行良好,我真的想避免使用一些PDF库。
任何关于D2D打印问题的意见都将不胜感激,因为互联网上真的缺乏相关信息。
编辑:我现在找到了一种方法,在发送图片到打印机之前对其进行光栅化,通过将DPI设置较低并绘制到第二个命令列表中使结果PDF文件更小。
最后一个问题是,在某些机器上,ID2D1PrintControl :: AddPage(...)-函数根本不返回/冻结计算机。没有失败,也没有成功,无论何时尝试打印具有多张图片的复杂场景。我还需要研究:打印机驱动程序,我可以尝试的所有各种打印机设置,这些机器上的directX版本(可能与此无关)。是否有任何其他想法可以导致AddPage函数不返回?是否有任何可能缺失的典型安装?可选输入作为第4和第5个参数的D2D1_TAG是否具有任何重要性?