2011-01-19 45 views
0

我目前正在使用FreeImage內部加載和分析圖像文件的C++中的簡單圖像類。無論如何,我不確定如何將像素數組儘可能通用,簡單和安全地實現。例如,班級應該處理不同的頻道數量。因爲現在我只想根據freeImage給我的文件類型和像素信息來決定使用哪種像素格式,所以在實際加載圖像時,必須在運行時做出確切的決定。我認爲解決這個問題的唯一方法是在圖像類定義中指向一些抽象的「像素」基類,然後像這樣在堆上分配正確的格式(基本上是工廠模式):用於圖像類的C++通用像素數組(支持多通道)

//pseudo code 
class Image{ 

    template<class T, class TNumChannels> 
    struct Pixel 
    { 
     T v[TNumChannels]; 
    }; 

    class BasePixelArray{...}; 

    class RGBPixelArray : 
      public std::vector<Pixel<uint8, 3> >, 
      public BasePixelArray 
    { 
     ... 
    }; 

private: 

    BasePixelArray * m_pixelPtr; 


public: 
    void loadImage(const std::string & _bla) 
    { 
     //parse and decide what pixelformat to use, i.e 
     m_pixelPtr = static_cast<BasePixelArray*>(new RGBPixelArray); 
     //fill array 
     .... 
    } 

}; 

我不認爲這是理想的,因爲我想避免從堆中分配,但由於它必須在運行時完成,所以我不能想到其他任何東西,所以我想知道如果你們中的任何一個人可能有更好的主意!

感謝

+0

不要的std ::矢量派生,這個類是不爲基礎類而設計。讓它成爲一個成員。 – ch0kee 2011-01-19 23:08:54

回答

0

如果你知道像事先的方方面面,如果它是一個大的圖像(實際上,它應該是比較小的圖像),你可以把它編譯時間分配上的堆棧。如果你不知道這些細節或者你想分配大的圖像,那麼堆上的分配是唯一的解決方案。

欲瞭解更多靈感,您可以查看Boost.GIL庫中的imageany_image型號。

+0

謝謝,以及我實際上意識到我必須在堆上分配,但我更喜歡解決方案,我不必在堆上創建std :: vector,而是讓它在內部管理其內存。這會讓它更安全。 – moka 2011-01-19 20:13:37

0

你沒有提到你的平臺,但是從Windows的角度看,這是我的建議是:

  • 堆棧,但是請記住,默認用戶堆棧大小爲1MB,可如果你控制而改變使用_beginthreadex()創建線程。
  • 堆,可能是最常見的選擇
  • 使用::VirtualAlloc直接,如果你分配/ dealloc的要麼非常大的緩衝區,或者分配/ dealloc的非常頻繁
+0

謝謝,我在OSX上,我需要跨平臺解決方案。對不起,不清楚「堆」,請參閱mloskot的帖子的評論。 – moka 2011-01-19 20:14:37

相關問題