用于图像类的c ++通用像素阵列(支持多个通道)

时间:2011-01-19 17:23:21

标签: c++ image pixels

我目前正在使用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 :(得分:0)

如果您事先知道图像的所有尺寸,并且它是一个大图像(实际上,它应该是相对较小的图像),您可以在堆栈上进行编译时分配。如果您不知道这些细节或者想要分配大图像,那么在堆上分配是唯一的解决方案。

要获得更多灵感,您可能需要查看Boost.GIL库中的imageany_image模型。

答案 1 :(得分:0)

您没有提到您的平台,但从Windows的角度来看,这是我的建议:

  • Stack,但请记住,默认用户堆栈大小为1MB,如果使用_beginthreadex()控制线程创建,则可以更改。
  • 堆,可能是最常见的选择
  • 如果您分配/释放非常大的缓冲区,或者非常频繁地使用alloc / dealloc,请直接使用::VirtualAlloc