如果它被其他应用程序复制(如照片,野生动物园等等),如何从UIPasteboard获取图像的原始数据?

时间:2013-10-10 11:17:56

标签: ios uiimage animated-gif uipasteboard

有没有办法从UIPasteboard而不是UIImage获取图像的原始数据,如果它被其他应用程序复制,如照片或移动游猎?

我目前正面临IOS 6.0和IOS 6.1之间的线路差异(也是7.0)

在IOS 6.0中,UIPasteboard通过照片或移动safari复制图像的项目包含图像的原始数据。 但在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)

似乎有一种解决方法,因为当我尝试在照片和电子邮件应用之间执行完全相同的操作时,它可以正常工作

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

如果您指定了正确的PasteboardType:

,您可以从UIPasteboard获取NSData
NSData* pasteData = [[UIPasteboard generalPasteboard] dataForPasteboardType:(NSString*)kUTTypeJPEG];

不要忘记导入

<MobileCoreServices/MobileCoreServices.h>

答案 1 :(得分:1)

现在好了,我自己想出来了。

您可以通过发送简单地获取图像形式的普通粘贴板的原始(二进制)数据 如果从Apple的内置Mobile Safari或照片应用程序复制,则会向普通粘贴板发送dataForPasteboardType:(NSSting*)PasteboardType消息。 (@“com.compuserve.gif”代表我的情况下的粘贴板类型)

我自己觉得有点愚蠢,没有尽快检查所有可通过的方法。 :(

我的困惑来自UIPasteboard的items属性。 我认为items包含当前粘贴板的所有数据。所以我尝试从粘贴板中保存该数组,并希望以后使用它,但我完全错了。

如UIPasteboard类参考中所述,items属性包含字典,其中键是表示类型,“”是与该类型相关联的对象。

此时,“”实际上是指代表的“值”,而不是该类型的数据。 “value”的含义与setValue: forPasteboardType:方法的值相同。

换句话说,即使您通过发送items消息将图像设置为粘贴板,也无法从setData: forPasteboardType:属性检索图像的原始(二进制)数据。(我在上面测试过它) IOS 7)

此外,IOS 6.0中来自items属性的图像的原始数据似乎是该操作系统版本的错误。 (这可能不是真的,这只是我的观点)

答案 2 :(得分:0)

UIPasteBoard将包含放置在其中的任何内容。由应用程序复制到粘贴板以将内容放入正确的格式。该应用程序可以将项目作为原始二进制数据或粘贴板中的UIImage等对象放置。

如果您在iOS版本之间获得了不同的东西,那么您可能正在使用不同版本的应用程序,或者只是以不同方式复制内容。

你是对的,你不能代表UIImage中的动画GIF,因为UIImage只包含一个图像。也许应用程序只是复制第一帧的位图数据?

您可以使用UIImageJPEGRepresentation将UIImage转换为原始JPEG数据。