NSView 到 PDF 和 PNG:为什么结果如此不同?
NSView to PDF and PNG: Why is the outcome so different?
我正在尝试将 NSView
保存到 PNG。
我从 NSView
开始,然后为 PNG 调用 dataWithPDF
或 cacheDisplay
。执行这两项操作的代码如下所示。
guard view.lockFocusIfCanDraw() else {
assert (false)
return
}
let pdfData = view.dataWithPDF(inside: rect)
guard let imgData = view.bitmapImageRepForCachingDisplay(in: rect) else {
assert(false)
}
view.cacheDisplay(in: rect, to: imgData)
view.unlockFocus()
try pdfData.write(to: pdfName, options: .atomic)
let pngData = imgData.representation(using: .png, properties: [:])
try pngData!.write(to: pngName, options: .atomic)
到目前为止,还不错。然而,这是不同的结果。
PDF(正确!)
这是 PNG 输出。可以看到,不包括子视图。箭头是作为 view
的一部分绘制的
为什么结果如此不同?
非常感谢!
Why is the outcome so different?
使用不同的(我显然没有你的视图)视图和子视图尝试你的代码按预期工作并且 PNG 很好。所以它必须与你的观点有关,但我不能就什么提出任何建议。然而...
当你有有效的 PDF 数据时,你可以使用类似的东西从中生成你的 PNG:
let captured = NSImage(data:pdfData)
let rep = NSBitmapImageRep(data:(captured?.tiffRepresentation)!)
let pngData = rep?.representation(using: NSPNGFileType, properties:[:])
(即 Swift 3,因此 NSPNGFileType
而不是 .png
)
这当然不能解决您遇到的任何问题,它可以避免它:-)您应该真正弄清楚为什么您的观点失败了,并将其视为临时的创可贴(假设它对您有用... ).
HTH
好的,我找到了答案。多亏了 "View Debugging",我才看到子视图使用了一层 (self.wantsLayer = true
)。图层并没有进入 PNG,而是进入 PDF。不确定这是错误还是功能。但是,现在我可以修复 PNG 输出。
我正在尝试将 NSView
保存到 PNG。
我从 NSView
开始,然后为 PNG 调用 dataWithPDF
或 cacheDisplay
。执行这两项操作的代码如下所示。
guard view.lockFocusIfCanDraw() else {
assert (false)
return
}
let pdfData = view.dataWithPDF(inside: rect)
guard let imgData = view.bitmapImageRepForCachingDisplay(in: rect) else {
assert(false)
}
view.cacheDisplay(in: rect, to: imgData)
view.unlockFocus()
try pdfData.write(to: pdfName, options: .atomic)
let pngData = imgData.representation(using: .png, properties: [:])
try pngData!.write(to: pngName, options: .atomic)
到目前为止,还不错。然而,这是不同的结果。
PDF(正确!)
view
的一部分绘制的
为什么结果如此不同?
非常感谢!
Why is the outcome so different?
使用不同的(我显然没有你的视图)视图和子视图尝试你的代码按预期工作并且 PNG 很好。所以它必须与你的观点有关,但我不能就什么提出任何建议。然而...
当你有有效的 PDF 数据时,你可以使用类似的东西从中生成你的 PNG:
let captured = NSImage(data:pdfData)
let rep = NSBitmapImageRep(data:(captured?.tiffRepresentation)!)
let pngData = rep?.representation(using: NSPNGFileType, properties:[:])
(即 Swift 3,因此 NSPNGFileType
而不是 .png
)
这当然不能解决您遇到的任何问题,它可以避免它:-)您应该真正弄清楚为什么您的观点失败了,并将其视为临时的创可贴(假设它对您有用... ).
HTH
好的,我找到了答案。多亏了 "View Debugging",我才看到子视图使用了一层 (self.wantsLayer = true
)。图层并没有进入 PNG,而是进入 PDF。不确定这是错误还是功能。但是,现在我可以修复 PNG 输出。