2017-02-19 16 views
1

Ok, Вот код, я использую:Как правильно вставить NSImage из NSPasteboard?

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' ([документация] (https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html)) Я получил это значение, исследуя элементы картона в отладчике –

2

Это потому, что Finder не копирование изображения, это копирование файлов пункт. Первичным представлением этого является URL, но другое представление - значок файла. Ни одно из представлений не является содержимым файла (то есть изображения JPEG).

Вы можете сначала проверить, может ли картон предоставить URL-адрес и создать изображение из URL-адреса. Только если это не удается, попробуйте создать изображение непосредственно из картона.

В качестве альтернативы вы можете перечислить pasteboardItems, что даст вам их в порядке, которое, по мнению источника, является наиболее актуальным. Остановитесь на первом, который является либо URL-адресом файла изображения, либо данными изображения.

+0

Спасибо за пояснение. Это было очень полезно –