2011-01-19 1 views
0

В настоящее время я работаю над простым классом изображений в C++, который использует FreeImage для загрузки и анализа файлов изображений. В любом случае я не совсем уверен, как реализовать свой массив пикселей как универсальный, простой и безопасный, насколько это возможно. Например, класс должен обрабатывать разные количества каналов. Поскольку на данный момент я просто хочу решить, какой формат пикселей использовать на основе типа файла и информации о пикселях, которую дает freeImage, точные решения должны приниматься во время выполнения при фактической загрузке изображения. Я думаю, что единственный способ справиться с этим состоит в том, чтобы иметь указатель на какой-то абстрактный базовый класс «Pixels» в определении класса изображения, а затем выделять правильный формат на куче, подобный этому (в основном заводской шаблон):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

Не проистекают из станд :: вектор, этот класс не является предназначенный для базового слоя. Сделайте это вместо этого. – ch0kee

ответ

0

Если вы знаете, все размеры изображения заранее, и если это большое изображение (на самом деле, это должно быть относительно небольшое изображение), вы можете сделать это во время компиляции выделение в стеке. Если вы не знаете эти данные или хотите выделить большое изображение, то выделение на куче является единственным решением.

Для дополнительного вдохновения вы можете взглянуть на модели image и any_image из библиотеки Boost.GIL.

+0

спасибо, ну, я действительно знаю, что мне нужно выделять кучу, но я бы предпочел решение, в котором мне не нужно создавать std :: vector в куче, но пусть он сам будет управлять своей памятью , Это сделает его более безопасным. – moka

0

Вы не упомянули свою платформу, но с точки зрения Windows, вот мой совет:

  • Stack, но имейте в виду, что по умолчанию размер стека пользователя 1MB, который может быть изменен, если вы управляете создание потока с использованием _beginthreadex().
  • Heap, вероятно, самый распространенный выбор
  • Использование ::VirtualAlloc напрямую, если вы Alloc/dealloc либо очень большие буферы, или Alloc/dealloc очень часто
+0

Спасибо, я на OSX, и мне нужны кросс-платформенные решения. Извините за то, что я не знаю о «куче», см. Комментарий к сообщению mloskot. – moka

 Смежные вопросы

  • Нет связанных вопросов^_^