0

私は現在、FreeImage を内部的に使用して画像ファイルを読み込んで解析する C++ の単純な画像クラスに取り組んでいます。とにかく、ピクセル配列をできるだけ一般的でシンプルかつ安全に実装する方法についてはよくわかりません。たとえば、クラスはさまざまなチャネル数を処理することになっています。現時点では、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

イメージのすべてのサイズが事前にわかっていて、イメージが大きい場合 (実際には比較的小さいイメージである必要があります)、コンパイル時にスタックに割り当てることができます。これらの詳細がわからない場合、または大きなイメージを割り当てたい場合は、ヒープへの割り当てが唯一の解決策です。

さらにインスピレーションを得るには、Boost.GILライブラリのimageおよびany_imageモデルを参照してください。

于 2011-01-19T17:43:37.530 に答える
0

プラットフォームについては言及されていませんが、Windows の観点からのアドバイスは次のとおりです。

  • スタック。ただし、デフォルトのユーザー スタック サイズは 1MB であり、_beginthreadex().
  • ヒープ、おそらく最も一般的な選択肢
  • ::VirtualAlloc非常に大きなバッファを割り当て/割り当て解除する場合、または非常に頻繁に割り当て/割り当て解除する場合は、直接使用してください
于 2011-01-19T18:08:59.330 に答える