универсальный массив пикселей c ++ (с поддержкой нескольких каналов) для класса изображений - PullRequest
0 голосов
/ 19 января 2011

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

//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
        ....
    }

};

Я не думаю, что это вообще идеально, так как я хотел бы избежать выделения из кучи, но так как это должно быть сделано во время выполнения, я не мог думать ни о чем другом, поэтому мне было интересно, если кто-нибудь изВы, ребята, могли бы иметь лучшую идею!

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 января 2011

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

  • Стек, но имейте в виду, что размер стека пользователя по умолчанию составляет 1 МБ, который можно изменить, еслиВы управляете созданием потока, используя _beginthreadex().
  • Heap, вероятно, самый распространенный выбор
  • Используйте ::VirtualAlloc напрямую, если вы выделяете / освобождаете либо очень большие буферы, либо очень часто используете alloc / dealloc
0 голосов
/ 19 января 2011

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

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

...