如何防止 PDFKit/NSImage 中的渲染瑕疵?
How to prevent rendering artifacts in PDFKit/NSImage?
我正在尝试创建一个工具来在 macOS 上光栅化矢量图像(存储在 PDF 文件中),但生成的图像在某些形状的边缘周围包含伪影。另一方面,Preview.app 始终完美呈现 PDF,如本例所示:
我试过:
- 使用 PDFKit 加载 PDF 文档,并使用
draw(with:to:)
和 thumbnail(of:for:)
渲染页面
- 将 PDF 文档加载到
NSImage
(创建 NSPDFImageRep
),并使用 cgImage(forProposedRect:context:hints:)
在这两种情况下,我都会得到这些类似混叠的伪像,如上图左侧所示。 PDF 文件不受我控制,因此无法更改以修复它可能存在的任何问题。出于性能原因,我目前正在尝试从开罗(正确呈现)迁移到 Apple 的 PDF 呈现(PDFKit 呈现它更快,尽管有这些工件)。
有什么我遗漏的可以修复输出的吗?
看来这个问题是由于我在多个线程上光栅化 PDF 引起的(特别是我的工具以多种分辨率光栅化 PDF,所以我想为什么不同时进行)。
在主线程上按顺序执行操作而不是修复它。我以为我想出了一种通过手动初始化 CGContext
来同时使用它的方法(而不是使用 NSImage
的 lockFocus()
/unlockFocus()
和 NSGraphicsContext.current
), 但是,唉,当我添加 context.scaleBy
(以生成不同大小的图像)时,它再次失败。
所以现在我只是在主线程上做,直到出现另一个解决方案。
我正在尝试创建一个工具来在 macOS 上光栅化矢量图像(存储在 PDF 文件中),但生成的图像在某些形状的边缘周围包含伪影。另一方面,Preview.app 始终完美呈现 PDF,如本例所示:
我试过:
- 使用 PDFKit 加载 PDF 文档,并使用
draw(with:to:)
和thumbnail(of:for:)
渲染页面
- 将 PDF 文档加载到
NSImage
(创建NSPDFImageRep
),并使用cgImage(forProposedRect:context:hints:)
在这两种情况下,我都会得到这些类似混叠的伪像,如上图左侧所示。 PDF 文件不受我控制,因此无法更改以修复它可能存在的任何问题。出于性能原因,我目前正在尝试从开罗(正确呈现)迁移到 Apple 的 PDF 呈现(PDFKit 呈现它更快,尽管有这些工件)。
有什么我遗漏的可以修复输出的吗?
看来这个问题是由于我在多个线程上光栅化 PDF 引起的(特别是我的工具以多种分辨率光栅化 PDF,所以我想为什么不同时进行)。
在主线程上按顺序执行操作而不是修复它。我以为我想出了一种通过手动初始化 CGContext
来同时使用它的方法(而不是使用 NSImage
的 lockFocus()
/unlockFocus()
和 NSGraphicsContext.current
), 但是,唉,当我添加 context.scaleBy
(以生成不同大小的图像)时,它再次失败。
所以现在我只是在主线程上做,直到出现另一个解决方案。