2013-10-10 34 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> 
相关问题