2017-02-19 53 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

感謝您的解釋。這是非常有幫助的 –