0

如果它被另一个应用程序(如照片或移动 safari)复制,有没有办法从 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)

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

有什么建议么?

4

3 回答 3

2

如果指定正确的 PasteboardType,则可以从 UIPasteboard 获取 NSData:

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

不要忘记导入

<MobileCoreServices/MobileCoreServices.h>
于 2014-07-22T08:26:57.387 回答
2

现在好了,我自己想通了。

dataForPasteboardType:(NSSting*)PasteboardType如果它是从 Apple 的内置移动 Safari 或照片应用程序复制的,您可以通过向通用粘贴板发送消息来简单地获取图像形式通用粘贴板的原始(二进制)数据 。(@"com.compuserve.gif" 在我的例子中是粘贴板类型)

我自己觉得有点愚蠢,没有早点检查所有可行的方法。:(

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

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

此时,“”指的是表示的真正“值”,而不是该类型的数据。“值”的这个含义与setValue: forPasteboardType:方法的值相同。

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

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

于 2013-10-12T08:39:23.320 回答
0

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

如果你在 iOS 版本之间得到了不同的东西,你可能正在使用不同版本的应用程序,或者它只是复制不同的东西。

没错,您不能在 a 中表示动画 GIF,UIImage因为 UIImage 仅包含单个图像。在这种情况下,也许应用程序只是复制第一帧的位图数据?

您可以使用UIImageJPEGRepresentation.

于 2013-10-10T12:40:46.490 回答