如何从 NSPasteboard 正确粘贴 NSImage?
How to paste an NSImage correctly from NSPasteboard?
好的,这是我使用的代码:
if let image = NSImage(pasteboard: pasteboard){
//..
}
我有 3 种方法可以将图像导入应用程序:
- 如果将图片拖到window,并使用拖拽粘贴板,则图片是正确的。
- 如果在浏览器中复制图像,"Copy Image"..并使用 NSPasteboard.general()..图像粘贴正确。
- 如果图像是在 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
}
}
好的,这是我使用的代码:
if let image = NSImage(pasteboard: pasteboard){
//..
}
我有 3 种方法可以将图像导入应用程序:
- 如果将图片拖到window,并使用拖拽粘贴板,则图片是正确的。
- 如果在浏览器中复制图像,"Copy Image"..并使用 NSPasteboard.general()..图像粘贴正确。
- 如果图像是在 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
}
}