【问题标题】:Copy multiple NSImage to NSPasteboard将多个 NSImage 复制到 NSPasteboard
【发布时间】:2018-08-10 05:44:44
【问题描述】:

我正在尝试使用 Swift 4 将多个 NSImage 复制到粘贴板 - 像这样:

private func putItemsOnPasteboard (_ items: [Int]) {
    if let images = mainImageController?.getNSImages(for: items) {
        NSPasteboard.general.clearContents()
        NSPasteboard.general.writeObjects(images)
        if let c = NSPasteboard.general.pasteboardItems?.count {
            print (c)
        }
    }
}

NSImage 实现了 NSPasteboardWriting,它运行良好。问题是,如果我随后粘贴到邮件中,它只会粘贴第一张图片,我正在努力找出原因。

例如,如果我用三个图像调用该函数,它似乎都可以工作,并且我的诊断“打印 (c)”正确显示“3”。但如果我粘贴到 Mail(或 OneNote 等)中,它只会粘贴第一张图片。

我知道 Mail 支持粘贴多个图像,因为我可以在 Apple Photos 中选择三个缩略图,将它们复制到粘贴板,然后它会正确地将所有三个都粘贴到 Mail 中。

任何线索将不胜感激!

【问题讨论】:

  • 你可能应该做的是从照片中复制,然后在你的应用程序中分析粘贴板的内容。然后尝试复制照片生成的粘贴板内容格式。

标签: swift macos cocoa nsimage nspasteboard


【解决方案1】:

如果我在照片中复制一组照片,然后检查粘贴板类型,我会得到:

import Cocoa

print(NSPasteboard.general.types?.map { $0.rawValue } ?? [])

输出:

["dyn.ah62d4rv4gu8ywyc2nbu1g7dfqm10c6xekr1067dwr70g23pw", "IPXPasteboardController", "com.apple.PhotoPrintProduct.photoUUID", "public.file-url", "CorePasteboardFlavorType 0x6675726C", "dyn.ah62d4rv4gu8y6y4grf0gn5xbrzw1gydcr7u1e3cytf2gn", "NSFilenamesPboardType", "dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu", "Apple URL pasteboard type"]

在这些类型中,我觉得有趣的是public.file-url,这表明照片正在将一组 URL 复制到粘贴板上。让我们检验一下这个假设:

import Cocoa

print(NSPasteboard.general.readObjects(forClasses: [NSURL.self], options: nil) ?? [])

输出:

[file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e03/UNADJUSTEDNONRAW_thumb_1e03.jpg, file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e04/UNADJUSTEDNONRAW_thumb_1e04.jpg, file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e05/kOBCUhzGRcyeVfBCC8VfvQ_thumb_1e05.jpg]

输出是 JPEG 文件的 URL 列表,这表明 Photos 确实提供了 URL 列表并将它们放在粘贴板上。因此,也许您可​​以将 NSImages 的 TIFF 表示形式保存到一个临时位置,然后将这些临时文件的 URL 写入粘贴板上,这样就可以了。

【讨论】:

    【解决方案2】:

    Charles Srstka 的回答在这里很有帮助。看来,虽然您可以在粘贴板上放置多个 NSImage,但您只能粘贴一个。

    Swift 的 URL 对象不符合 NSPasteboardWriting,但是 NSURL 可以,而且没有只能粘贴一个的限制。

    这样就成功了

        private func putImagesOnPasteboard (_ images: [Image], folderURL: URL) {
        let imageURLs = images.map() {
            image in
            return NSURL (fileURLWithPath: folderURL.appendingPathComponent(image.fileName).path)
        }
        NSPasteboard.general.clearContents()
        NSPasteboard.general.writeObjects(imageURLs)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      相关资源
      最近更新 更多