8 ビット グレースケール bmp の読み取りに問題があります。ヘッダーから情報を取得してパレットを読み取ることはできますが、ピクセル値をパレット エントリに参照することはできません。ここで、ピクセルデータの読み取り方法を見つけましたが、パレットを使用した bmp の場合の実際の使用方法はわかりません。私は初心者です。私の目標は、一度に 1 行のピクセルのみを読み取ることです。
コード:
#include <iostream>
#include <fstream>
using namespace std;
int main(int arc, char** argv)
{ const char* filename="Row_tst.bmp";
remove("test.txt");
ofstream out("test.txt",ios_base::app);//file for monitoring the results
FILE* f = fopen(filename, "rb");
unsigned char info[54];
fread(info, sizeof(unsigned char), 54, f); // read the header
int width = *(int*)&info[18];
int height = *(int*)&info[22];
unsigned char palette[1024]; //read the palette
fread(palette, sizeof(unsigned char), 1024, f);
for(int i=0;i<1024;i++)
{ out<<"\n";
out<<(int)palette[i];
}
int paletteSmall[256]; //1024-byte palette won't be needed in the future
for(int i=0;i<256;i++)
{ paletteSmall[i]=(int)palette[4*i];
out<<paletteSmall[i]<<"\n";
}
int size = width;
//for(int j=0;j<height;j++)
{ unsigned char* data = new unsigned char[size];
fread(data, sizeof(unsigned char), size, f);
for(int i=0;i<width;i++)
{ cout<<"\n"<<i<<"\t"<<paletteSmall[*(int*)&data[i]];
}
delete [] data;
}
fclose(f);
return 0;
}
test.txt で取得した内容は問題ないようです。最初の値は 0 0 0 0 から 255 255 255 0 (パレット) で、次の値は 0 から 255 (paletteSmall) です。
問題は、ピクセル値をカラー テーブル エントリに参照できないことです。おそらく、テーブルの存在しない要素を使用しようとしたことを示す症状で、アプリケーションが崩壊します。私が正しく理解していれば、カラー テーブルを持つ bmp のピクセルにはカラー テーブル要素の番号が含まれているはずなので、なぜ機能しないのかわかりません。私はあなたの助けを求めます。