【问题标题】:How can I get raw data of image from UIPasteboard if it's copied by another app (such as photos, safari, etc..)如果 UIPasteboard 被另一个应用程序(例如照片、Safari 等)复制,如何从 UIPasteboard 获取图像的原始数据
【发布时间】:2013-10-18 03:04:56
【问题描述】:

如果图像被其他应用(如照片或移动 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)

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

有什么建议吗?

【问题讨论】:

    标签: ios uiimage animated-gif uipasteboard


    【解决方案1】:

    好吧,我自己想通了。

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

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

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

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

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

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

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

    【讨论】:

    • 我什么都试过了,你的回答拯救了我的一天。
    【解决方案2】:

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

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

    别忘了导入

    <MobileCoreServices/MobileCoreServices.h>
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 首先,感谢您的回答。我知道 UIPastedboard 的内容取决于从哪里复制内容,但正如我之前提到的,我专注于 Apple 的内置照片和移动 Safari。 (不是其他verious第三方应用程序)似乎有一种解决方法,因为当我从Mobile Safari复制动画gif并将其粘贴到内置电子邮件应用程序时,它可以正常工作。我测试了几次,我发现电子邮件应用程序不是从 url 重新下载它,只是从 UIPastedboard 粘贴它。 (我从 safari 复制它并打开飞行模式并将其粘贴到电子邮件应用程序,它可以工作)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2015-03-03
      • 2018-09-08
      相关资源
      最近更新 更多