有没有办法从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)
似乎有一种解决方法,因为当我尝试在照片和电子邮件应用之间执行完全相同的操作时,它可以正常工作
有什么建议吗?
答案 0 :(得分:2)
如果您指定了正确的PasteboardType:
,您可以从UIPasteboard获取NSDataNSData* 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数据。