如何从NSPasteboard正确粘贴NSImage?

时间:2017-02-19 00:10:49

标签: swift macos nspasteboard

好的,以下是我使用的代码:

{x[0]: x[1:] for x in lst}  
# {'267-10-7633': ['66', '85', '74', 0], '709-40-8165': ['71', '96', '34', 0]}

我有三种方式可以让图像进入应用程序:

  1. 如果将图像拖动到窗口,并使用拖动粘贴板,则图像正确。
  2. 如果在浏览器中复制图像,"复制图像" ..并使用NSPasteboard.general()..图像被正确粘贴。
  3. 如果在Finder中复制图像,请右键单击 - >复制" image-name.jpg"。然后粘贴的图像不正确。相反,我得到JPEG文件类型的图标。
  4. 我尝试了其他方法,包括苹果代码片段(相同的结果,我得到图标而不是图片本身):

    if let image = NSImage(pasteboard: pasteboard){
        //..
    }
    

2 个答案:

答案 0 :(得分:4)

粘贴板确实包含文件的路径,您可以使用它来从磁盘加载图像:

func paste(_ sender: AnyObject) {
    let pasteboard = NSPasteboard.general()

    if let data = pasteboard.data(forType: kUTTypeFileURL),
        let str =  String(data: data, encoding: .utf8),
        let url = URL(string: str),
        let image = NSImage(contentsOf: url)
    {
        imageView.image = image
    }
}

答案 1 :(得分:2)

那是因为Finder没有复制图像,它正在复制文件项。这个的主要表示是一个URL,但另一个表示是文件图标。所有表示都不是文件的内容(即JPEG图像)。

您可以先检查粘贴板是否可以提供URL并从URL创建图像。只有在失败时才尝试直接从粘贴板创建图像。

或者,您可以枚举pasteboardItems,它会按照源应用认为最相关的顺序为您提供。在第一个停止,它是图像文件的URL或图像数据。