2012-04-30 25 views
5

我有一堆圖像文件在專有的二進制格式,我想加載到NSImages。格式不是一個簡單的位圖,而是一種RLE表示形式,混合了透明度和其他附加信息。將專有二進制映像文件加載到NSImage的推薦方法是什麼?

爲了在Cocoa應用程序中顯示這些圖像中的一個,我需要一種方法來逐字節地解析圖像文件,然後「計算」一個位圖,然後將其放入NSImage中。

在Objective-C/Cocoa中做這件事的好方法是什麼?

回答

7

解釋圖像數據的任務是由圖像的表示對象處理的。要使用專有格式,您有以下幾種選擇:(a)創建自定義表示類,(b)將NSCustomImageRep與自定義委託一起使用,或者(c)使用自定義對象將圖像轉換爲支持的格式,例如一個原始位圖。

如果您選擇創建自定義表示類,您將創建NSImageRep的子類,如Creating New Image Representation Classes中所述。這基本上要求你的班級註冊並能夠繪製圖像數據。除此之外,您可以覆蓋方法來返回有關圖像的信息,並且您可以使用正常的NSImage方法實例化圖像。這種方法需要最多的工作。

使用NSCustomImageRep比創建自定義實現需要更少的工作。您的委託對象只需要能夠在固定位置繪製圖像。但是,您無法返回有關圖像的其他信息,並且在創建NSImage之前需要手動創建NSCustomImageRep對象。

將圖像轉換爲其他格式也比創建自定義表示更簡單。它可以像創建合適大小的空白NSImage一樣簡單並繪製到其中。由於您需要調用翻譯方法,因此創建圖像會更加複雜,而且這會影響效率(未來繪圖時間和內存使用率),因爲您正在更改格式,這可能是好的或不好的。您也將失去圖像對象與其來源之間的任何關聯。

+0

可用選項的好摘要,謝謝!至於第三種選擇:我只需要在創建'NSImage'時進行一次轉換,對吧?這將如何影響未來的繪圖時間?此外,什麼是最有效的方式來繪製一個'NSImage'?我在某處讀到關於每次寫入像素時創建一個「NSColor」對象的解決方案。這看起來不太有效,因爲我需要處理數百兆字節的圖像數據。 – tajmahal

+0

@tajmahal是的,你只會做一次繪圖。將來,繪圖將使用您轉換爲的任何格式完成,如果您只是繪製圖像,這可能會盡可能快。如果你的格式是位圖格式,你可以通過改變它來將其「繪製」爲位圖格式。「NSImage」支持而不是創建顏色對象並繪製單個像素。如果你的格式是矢量格式,你可能想用Cocoa繪圖方法或Core Graphics函數來繪製它。 CG也有陰影物體,讓你通過一個函數爲每個像素提供顏色。 – ughoavgfhw

相關問題