1

BmpファイルをCの下で2次元または1次元の配列に読み込む方法を探しました。多くの解決策がありますが、必要な解決策はありません。黒と白のbmpを(最初に)0から255(グレースケール)の値を含む必要がある2次元配列に読み込んでから、それを1次元配列に変換する必要があります(ただし、これは問題ではありません)。Matlabはこれを自動的に実行しますが、最後にC / C ++でより自律的に動作するようにしたいので、bmpはPostgreデータベースのint配列に保存されます。ありがとう

4

2 に答える 2

0

別のSOの質問のために作成したbmpローダーがあります。http:
//nishi.dreamhosters.com/u/so_bmp_v0.zip Bmp
の例にはRGBがありますが、グレースケールでも機能するようです。

FILE* f = fopen( "winnt.bmp", "rb" ); if( f==0 ) return 1;
fread( buf, 1,sizeof(buf), f );
fclose(f);

BITMAPFILEHEADER& bfh = (BITMAPFILEHEADER&)buf[0];
BITMAPINFO& bi = (BITMAPINFO&)buf[sizeof(BITMAPFILEHEADER)];
BITMAPINFOHEADER& bih = bi.bmiHeader; 
char* bitmap = &buf[bfh.bfOffBits];
int SX=bih.biWidth, SY=bih.biHeight;

ここでのビットマップは、ピクセルテーブルへのポインタです(ただし、適切にアクセスするには、符号なしにする必要があります)。bmpのピクセル行は逆の順序で格納できることに注意してください。

于 2011-03-18T11:22:32.363 に答える
0

申し訳ありませんが、質問を読み間違えました:/
ルールを少し「ねじる」ことを気にしないのであれば

#include <stdio.h>

int main(void) {
  int data[100][30] = {{0}}; /* initialize 2D array to all zeroes */
  int *p1d;
  size_t index;

  data[42][20] = 42; /* set 1 element ot 42 */
  p1d = &data[0][0];
  index = 42*30 + 20;
  printf("%d (should be 42)\n", p1d[index]); /* pretend it's a 1D array */
  return 0;
}

于 2011-03-18T09:50:55.730 に答える