0

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 のピクセルにはカラー テーブル要素の番号が含まれているはずなので、なぜ機能しないのかわかりません。私はあなたの助けを求めます。

4

1 に答える 1