2017-02-19 99 views
1

好吧,下面是我使用的代码:如何从NSPasteboard正确粘贴NSImage?

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

而且我有3种方式,其中图像进入应用程序:

  1. 如果图像拖动到窗口,并使用拖动纸板,图像是正确的。
  2. 如果在浏览器中复制图像“复制图像”并使用NSPasteboard.general()..图像被正确粘贴。
  3. 如果在Finder中复制图像,请右键单击 - >复制“image-name.jpg”。那么粘贴的图像是不正确的。相反,我得到JPEG文件类型的图标。

我尝试过其他方法,包括苹果的片段(同样的结果,我得到的,而不是图像本身的图标):

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

回答

2

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

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

是的,这是完美的作品。 任何想法,如果有一个官方定义的“public.file-url”的地方?看来这些文件没有关于粘贴板如何工作的细节。 –

+0

实际上有一个常数:'kUTTypeFileURL'([documentation](https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html))我得到了通过检查调试器中的粘贴板项目来确定值 –

2

这是因为搜索是不是抄袭的图像,它是复制文件项目。它的主要表现形式是URL,但另一种表示形式是文件图标。没有表示是文件(即JPEG图像)的内容

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

或者,您可以枚举pasteboardItems,它会按照源应用程序认为最相关的顺序给它们。首先停止,它是图像文件或图像数据的URL。

+0

感谢您的解释。这是非常有帮助的 –