2014-10-08 98 views
2

我有一个NSImage的实例,这个实例已经由一个我不能控制的API实现。如何获得NSImage背后的*原始数据?

我想获得原始数据从该NSImage创建(NSData),而数据被转换为另一种表示/格式(或以其他方式“骚扰”)。如果图像是从一个文件创建的,我想要文件中包含所有元数据等的字节或字节内容。如果图像是从某个任意的NSData实例创建的,我想要一个精确的字节对字节 - NSData的等效副本。

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

编辑:我知道这可能不是严格可以用于所有的NSImage一切都是时间;对于从文件和/或数据中确定创建的的图像子集,如何?

我还没有想出一个办法做到这一点。有人有主意吗?

回答

2

这是不可能的。

一方面,不是所有的图像通过数据支持。有些可能是程序性的。例如,使用+imageWithSize:flipped:drawingHandler:创建的图像需要一个绘制图像的块。

但是,在任何情况下,即使CGImage将数据转换进口,这是我们所低层为Mac的框架得到。

3

我同意肯,并具有条件的子集(我知道这是从文件中读取一个GIF)不会改变任何东西。当你有一个NSImage时,数据已经发生了很多事情。 Cocoa不喜欢在内存中保存一堆并不直接需要的数据。如果你有一个原始CGImage(出NSImage的产生不是一个),你可能会真的很幸运,找到你想要CGDataProviderCopyData数据,但即使它发生在工作中,有关于它的任何承诺。

但想通过你怎么可能,如果你碰巧得到非常幸运,尽量使其工作:

  • 获取表征的清单,-imageRepresentations
  • 找到一个匹配原来的(希望只有一个)
  • 从它得到一个CGImage-CGImageForProposedRect:context:hints。你可能想要一个匹配图像大小的矩形,我可能会传递一个没有插值的提示。
  • 获取数据提供商CGImageGetDataProvider
  • 将其数据复制到CGDataProviderCopyData。 (但我怀疑这将是实际的原始数据,包括元数据,字节对字节。)

有回调,将让你直接字节指针到内部数据CGDataProvider(如CGDataProviderGetBytePointerCallback) ,但我不知道有什么办法来请求现有CGDataProvider的回调列表。这通常是Quartz访问的东西,我们只是在创建过程中通过。

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

+1

如果你希望图像代表得到幸运,你应该检查一个是否是'NSBitmapImageRep',如果是,则调用'-CGImage'而不是'-CGImageForProposedRect:context:hints:'。 – 2014-10-08 20:02:20

相关问题