【问题标题】:How to paste an NSImage correctly from NSPasteboard?如何从 NSPasteboard 正确粘贴 NSImage?
【发布时间】:2017-02-20 04:20:40
【问题描述】:

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

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

我有 3 种方式让图像进入应用程序:

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

我尝试了其他方法,包括苹果的 sn-p(结果相同,我得到的是图标而不是图像本身):

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

【问题讨论】:

    标签: swift macos nspasteboard


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这非常有效。如果某处有“public.file-url”的官方定义,有什么想法吗?似乎文档缺乏关于粘贴板实际工作原理的详细信息。
    • 实际上有一个常量:kUTTypeFileURL (documentation) 我通过检查调试器中的粘贴板项目得到了这个值
    • 你的实现有点迂回:让 filenameURL = NSURL(from: pasteboard) as URL?节省中间步骤。 (唉,没有办法直接从粘贴板获取 URL。)
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的解释。这很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多