【问题标题】:How to prevent rendering artifacts in PDFKit/NSImage?如何防止 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 我认为这实际上可能是一个单独的并发问题,一旦我确认我会发布答案。

标签: cocoa nsimage apple-pdfkit


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 2015-11-03
    • 2018-05-10
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多