2014-10-08 36 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

相關問題