如何从 NSPasteboard 正确粘贴 NSImage?

How to paste an NSImage correctly from NSPasteboard?

好的,这是我使用的代码:

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

我有 3 种方法可以将图像导入应用程序:

  1. 如果将图片拖到window,并使用拖拽粘贴板,则图片是正确的。
  2. 如果在浏览器中复制图像,"Copy Image"..并使用 NSPasteboard.general()..图像粘贴正确。
  3. 如果图像是在 Finder 中复制的,请右键单击 -> 复制 "image-name.jpg"。那么粘贴的图像不正确。相反,我得到了 JPEG 文件类型的图标。

我尝试了其他方法,包括 apple 的代码片段(结果相同,我得到的是图标而不是图像本身):

NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
NSArray *classArray = [NSArray arrayWithObject:[NSImage class]];
NSDictionary *options = [NSDictionary dictionary];

BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options];
if (ok) {
    NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options];
    NSImage *image = [objectsToPaste objectAtIndex:0];
    [imageView setImage:image];
}

那是因为 Finder 不是在复制图像,而是在复制文件项。其主要表示形式是 URL,但另一种表示形式是文件图标。 None 的表示是文件的 内容(即 JPEG 图像)。

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

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

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

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
    }
}