我目前正在使用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
....
}
};
我认为这根本不是理想的,因为我想避免从堆中分配,但由于它必须在运行时完成,我真的不能想到其他任何东西,所以我想知道你是否有人伙计们可能有更好的主意!
由于
答案 0 :(得分:0)
如果您事先知道图像的所有尺寸,并且它是一个大图像(实际上,它应该是相对较小的图像),您可以在堆栈上进行编译时分配。如果您不知道这些细节或者想要分配大图像,那么在堆上分配是唯一的解决方案。
要获得更多灵感,您可能需要查看Boost.GIL库中的image
和any_image
模型。
答案 1 :(得分:0)
您没有提到您的平台,但从Windows的角度来看,这是我的建议:
_beginthreadex()
控制线程创建,则可以更改。::VirtualAlloc