如何防止 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。您是否尝试在PDFViewNSImageView 中显示PDF 文件?创建一个测试项目,添加视图,设置接受拖动文件/可编辑,运行,拖动文件,任何工件? 也许这个讨论有帮助:PDF to JPG Conversion in COCOA @Willeke 我认为这实际上可能是一个单独的并发问题,一旦我确认我会发布答案。 【参考方案1】:

所以看起来问题是由于我在多个线程上对 PDF 进行了光栅化(特别是我的工具以多种分辨率对 PDF 进行了光栅化,所以我想为什么不同时进行)。

在主线程上按顺序执行操作而不是修复它。我以为我想出了一种方法来通过手动初始化CGContext 来同时使用它(而不是使用NSImagelockFocus()/unlockFocus()NSGraphicsContext.current),但是唉,我尽快我添加了一个context.scaleBy(生成不同大小的图像),它又失败了。

所以现在我只是在主线程上做,直到出现另一个解决方案。

【讨论】:

以上是关于如何防止 PDFKit/NSImage 中的渲染伪影?的主要内容,如果未能解决你的问题,请参考以下文章

状态变化时如何防止 FlatList 重新渲染

防止伪元素触发滚动

android app怎么防止反编译

如何防止 react 重新渲染整个组件?

React 限制渲染次数以防止无限循环...重新渲染次数过多

React(性能):如何防止每次状态更改时出现不必要的渲染? [复制]