如何防止 PDFKit/NSImage 中的渲染伪影?
Posted
技术标签:
【中文标题】如何防止 PDFKit/NSImage 中的渲染伪影?【英文标题】:How to prevent rendering artifacts in PDFKit/NSImage? 【发布时间】:2021-09-25 22:10:36 【问题描述】:我正在尝试在 macOS 上创建一个工具来光栅化存储在 PDF 文件中的矢量图像,但生成的图像在某些形状的边缘周围包含伪影。另一方面,Preview.app 总是完美地呈现 PDF,如下例所示:
我试过了:
使用 PDFKit 加载 PDF 文档,并使用draw(with:to:)
和 thumbnail(of:for:)
呈现页面
将 PDF 文档加载到NSImage
(创建NSPDFImageRep
),并使用cgImage(forProposedRect:context:hints:)
在这两种情况下,我都会得到这些类似混叠的伪影,如上图左侧所示。 PDF 文件不在我的控制范围内,因此无法更改以修复它可能存在的任何问题。出于性能原因,我目前正在尝试从 Cairo(正确渲染)迁移到 Apple 的 PDF 渲染(PDFKit 渲染它的速度要快得多,尽管有这些工件)。
有什么我错过的可以修复输出的吗?
【问题讨论】:
请发布您的代码。看起来预览使用PDFView
。您是否尝试在PDFView
或NSImageView
中显示PDF 文件?创建一个测试项目,添加视图,设置接受拖动文件/可编辑,运行,拖动文件,任何工件?
也许这个讨论有帮助:PDF to JPG Conversion in COCOA
@Willeke 我认为这实际上可能是一个单独的并发问题,一旦我确认我会发布答案。
【参考方案1】:
所以看起来问题是由于我在多个线程上对 PDF 进行了光栅化(特别是我的工具以多种分辨率对 PDF 进行了光栅化,所以我想为什么不同时进行)。
在主线程上按顺序执行操作而不是修复它。我以为我想出了一种方法来通过手动初始化CGContext
来同时使用它(而不是使用NSImage
的lockFocus()
/unlockFocus()
和NSGraphicsContext.current
),但是唉,我尽快我添加了一个context.scaleBy
(生成不同大小的图像),它又失败了。
所以现在我只是在主线程上做,直到出现另一个解决方案。
【讨论】:
以上是关于如何防止 PDFKit/NSImage 中的渲染伪影?的主要内容,如果未能解决你的问题,请参考以下文章