2013-10-10 33 views
0

有沒有辦法從UIPasteboard獲取圖像的原始數據而不是UIImage,如果它被另一個應用程序複製應用程序,如照片或移動Safari瀏覽器?如何從UIPasteboard獲取圖像的原始數據(如照片,Safari等)

我目前面臨的IOS 6.0和6.1的IOS(7.0也)

之間的有線差異在IOS 6.0,通過照片或移動Safari瀏覽器複製圖像的UIPasteboard的項目包含圖像的原始數據。 但在IOS 6.1及以上版本中,它包含UIImage而不是原始數據。

在IOS 6.0,UIPasteboard的複製的項目下面

Printing description of array: 
<__NSArrayM 0x8a804c0>(
{ 
    "com.compuserve.gif" = <47494638 39614002 ...... 3b3a2000 3b>; 
    "public.url" = "url of the image...."; 
} 
) 

是在IOS 6.1以上,它含有的UIImage代替原始數據。

Printing description of array: 
<__NSArrayM 0xa25b7b0>(
{ 
    "com.compuserve.gif" = "<UIImage: 0x9429570>"; 
    "public.url" = "url of the image..."; 
} 
) 

如果該圖像格式是PNG或JPEG,那就不是那麼糟糕。 (如果它是JEPG,我仍然需要再次壓縮) 但是,當我嘗試粘貼動畫gif圖像時,它變得更加複雜。

我甚至不知道從通常的UIImage創建動畫gif圖像是否可以通過。

我可以再次從原始網址下載,但下載我已經有的數據似乎不是很好的解決方案,我認爲。 而且,如果它是從照片應用複製的,則不存在此類網址。 (這裏有一些名爲「com.apple.mobileslideshow.asset-object-id-uri」的神祕uri,它沒有記錄,而不是url)

似乎有一種解決方法,因爲當我嘗試在照片和電子郵件之間進行完全相同的操作時它可以正常工作

有什麼建議嗎?

回答

1

現在,我想出了自己。

如果是從Apple內置的Mobile Safari或Photos App複製的,您可以簡單地通過發送 dataForPasteboardType:(NSSting*)PasteboardType消息到普通粘貼板來獲取圖像形式普通粘貼板的原始(二進制)數據。 (@ com.compuserve.gif「爲我的情況下的粘貼板類型)

我自己感覺有點愚蠢,因爲沒有儘快檢查所有可用的方法。 :(

我的混淆來自items屬性的UIPasteboard。 我認爲items包含當前紙板的所有數據。所以我嘗試從粘貼板保存這個數組,並希望稍後使用它,但我完全錯了。

如UIPasteboard Class Reference中所述,items屬性包含字典,其中鍵爲表示類型,「」值爲「與該類型關聯的對象。

在這個時間點,「」實際上是指表示的「值」,而不是該類型的數據。 「值」的含義與setValue: forPasteboardType:方法的值相同。

在換句話說,不能從items屬性通過發送setData: forPasteboardType:消息檢索圖像的原始(二進制)的數據,即使將圖像設置到剪貼板。(我測試IOS 7)

另外,IOS6.0中items屬性的圖像原始數據似乎是該操作系統版本的一個缺陷。 (這可能不是真的,這只是我的意見)

+0

我已經嘗試了一切,而你的回答保存了我的一天。 –

0

UIPasteBoard將包含放置在其中的任何東西。這取決於將應用程序複製到粘貼板以將內容放入正確的格式。該應用程序可以將項目作爲原始二進制數據或UIImage等對象放置在粘貼板中。

如果你在iOS版本之間得到不同的東西,你可能會使用不同版本的應用程序,或者它只是簡單地複製不同的東西。

你是對的,你不能代表一個UIImage的動畫GIF,因爲UIImage只包含一個圖像。在這種情況下,應用程序可能只是複製第一幀的位圖數據?

您可以使用UIImageJPEGRepresentation將UIImage轉換爲原始JPEG數據。

+0

首先,感謝回答。我知道UIPastedboard的內容取決於拷貝的位置,但正如我之前提到的,我專注於Apple內置的Photos and Mobile Safari。 (而不是其他好的第三方應用程序)似乎有一個解決方法,因爲當我從Mobile Safari複製動畫gif並將其粘貼到內置電子郵件應用程序時,它可以正常工作。我測試了幾次,我發現電子郵件應用不會從網址重新下載,只需從UIPastedboard粘貼即可。 (我從Safari瀏覽器中複製出來,打開飛行模式並粘貼到電子郵件應用程序,它的工作原理) – onnlv

0

您可以從UIPasteboard如果指定權PasteboardType得到的NSData:

NSData* pasteData = [[UIPasteboard generalPasteboard] dataForPasteboardType:(NSString*)kUTTypeJPEG]; 

不要忘了導入

<MobileCoreServices/MobileCoreServices.h> 
相關問題