如何在NSImage后面获取*原始*数据?

时间:2014-10-08 15:58:02

标签: macos nsimage

我有一个NSImage的实例,这个实例是由我无法控制的API实现的。

我想获取创建NSData原始数据(NSImage),而不会将数据转换为其他表示/格式(或其他方式)调戏“)。如果图像是从文件创建的,我想要文件的确切的逐字节内容,包括所有元数据等。如果图像是从某个任意NSData实例创建的,我想要一个精确的字节 - {1}}的等效字节副本。

要迂腐(因为这是我遇到的麻烦案例),如果NSData是从动画GIF创建的,我需要找回实际包含原始版本的NSImage动画GIF,不受干扰。

编辑:我意识到所有NSData的所有时间都不可能完全存在;那些 的图像子集是如何从文件和/或数据中创建的呢?

我还没有找到办法做到这一点。有人有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我同意肯,并且有一部分条件(我知道它是从文件中读取的GIF)并没有改变任何东西。当你有NSImage时,数据已经发生了很多事情。 Cocoa不喜欢在内存中保存一堆不直接需要的数据。如果您有原始CGImage(不是NSImage生成的原始版本),您可能会非常幸运并在CGDataProviderCopyData中找到您想要的数据,但即使它恰好有效,对它没有任何承诺。

但是想一想你是怎么想的,如果碰巧遇到了不可思议的幸运,试着让它发挥作用:

  • 使用-imageRepresentations获取表示列表。
  • 找到与原作相匹配的那个(希望只有那个)
  • 使用CGImage-CGImageForProposedRect:context:hints获取CGImageGetDataProvider。你可能想要一个与图像大小相匹配的矩形,我可能会传递一些没有插值的提示。
  • 使用CGDataProviderCopyData
  • 获取数据提供者
  • 使用CGDataProvider复制其数据。 (但我怀疑这将是包括元数据在内的实际原始数据,逐字节。)

有回调可以让你直接指向CGDataProviderGetBytePointerCallback的内部数据(如CGDataProvider),但我不知道有什么方法可以请求回调列表来自现有的{{1}}。这通常是Quartz访问的内容,我们只是在创建过程中通过。

我强烈怀疑这是不可能的。

答案 1 :(得分:2)

这是不可能的。

首先,并非所有图像都由数据支持。有些可能是程序性的。例如,使用+imageWithSize:flipped:drawingHandler:创建的图像采用绘制图像的块。

但是,无论如何,即使CGImage转换了导入数据,也就像Mac框架那样低级别。