我有一个NSImage
的实例,这个实例是由我无法控制的API实现的。
我想获取创建NSData
的原始数据(NSImage
),而不会将数据转换为其他表示/格式(或其他方式)调戏“)。如果图像是从文件创建的,我想要文件的确切的逐字节内容,包括所有元数据等。如果图像是从某个任意NSData
实例创建的,我想要一个精确的字节 - {1}}的等效字节副本。
要迂腐(因为这是我遇到的麻烦案例),如果NSData
是从动画GIF创建的,我需要找回实际包含原始版本的NSImage
动画GIF,不受干扰。
编辑:我意识到所有NSData
的所有时间都不可能完全存在;那些 的图像子集是如何从文件和/或数据中创建的呢?
我还没有找到办法做到这一点。有人有什么想法吗?
答案 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框架那样低级别。