使用している関数 ( FreeImage::GetBits ) を教えていただいたので、画像の生データをクエリしていることがわかります。そのサイズは、次の式に示すように、画像のピッチと高さの積です。
int size = image.GetPitch() * image.GetHeight();
これはバイト単位のサイズであり、char
ポインターにアクセスする場合の要素の数です。しかし、そのような場合に「要素の数」について話すこと (低レベルのメモリ、高レベルの型を持たないビット ストリームについて話す場合) は、質問を読んだときにそれが約より高いと考えるかもしれないので、少し誤解を招く可能性があります。レベル配列。
ご参考までに: 生の画像データは、通常pitch
、左から右に 1 ピクセルずつ size の行に配置されます。ピクセルあたりのサイズは、ストレージ形式によって異なります (たとえば、1 バイトのグレースケール、3 バイトの RGB と 8ビット/チャネル、モノクロ ビットマップの場合は 1 ビット、その他多数の形式)。
これらの行は、上から下 (ほとんどの場合) または下から上 (たとえば、BMP ファイル形式の場合) に配置されます。pitch
少なくとも画像のwidth
ピクセルあたりのサイズを掛けたものであるため、すべてのピクセルはそのような「スキャンライン」にスペースを持ちます。これは、画像の行ごとのメモリがどのように呼び出されるかです。いくつかの位置合わせに切り上げられるため、すべての行は、イメージ全体のメモリ内の位置合わせされたアドレスから開始できます。未使用のスペースは「パディング」と呼ばれ、無視されます。
ライブラリによっては、「ピッチ」が「1 行あたりのバイト数」ではなく、メモリ内の「1 行あたりのピクセル数」を意味する場合がありますが、この場合は既にバイト単位で指定されているため、画像の高さを掛けるだけで済みます。通常、高さは幅のようにパディングされないことに注意してください。これを行う利点がないためです。