0

我目前正在用 C++ 编写一个简单的图像类,它在内部使用 FreeImage 来加载和解析图像文件。无论如何,我不太确定如何将我的像素数组实现为尽可能通用、简单和安全。例如,该类应该处理不同的通道数。因为现在我只想根据 freeImage 给我的文件类型和像素信息来决定使用哪种像素格式,所以必须在运行时实际加载图像时做出确切的决定。我认为解决这个问题的唯一方法是在图像类定义中有一个指向一些抽象“像素”基类的指针,然后像这样在堆上分配正确的格式(基本上是工厂模式):

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

};

我认为这根本不理想,因为我想避免从堆中分配,但由于它必须在运行时完成,我真的想不出其他任何东西,所以我想知道你们中是否有人可能有一个更好的主意!

谢谢

4

2 回答 2

0

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

  • 堆栈,但请记住,默认用户堆栈大小为 1MB,如果您使用_beginthreadex().
  • 堆,可能是最常见的选择
  • ::VirtualAlloc如果您分配/释放非常大的缓冲区,或者非常频繁地分配/释放,则直接使用
于 2011-01-19T18:08:59.330 回答
0

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

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

于 2011-01-19T17:43:37.530 回答