2

はい、これに関連する他の質問を確認しましたが、あまり役に立ちませんでした。彼らはいくつかの助けになりましたが、私はまだ少し混乱しています. だからここで私がする必要があること:

132x65 の画面があります。132x65 の .bmp があります。.bmp を調べて、それを小さな 1x8 列に分割して、その 32 ビット列のバイナリを取得したいと考えています。次に、それを横方向に 132 回、下方向に 9 回行います。白でないものはビットとしてカウントする必要があります。例:

画像の左上のピクセルが白以外の色で、その下の 7 ピクセルが白の場合、それが配列の最初の要素、つまりその数値の 16 進数になるため、配列は次のようになります。 ] = { 0x01 } そして、それらの 132 列を塗りつぶし続け、行の 9 つの「セクション」に対して再度実行します。ファイルの結果は、別のファイル内のその配列のみになります。

私はこれのヘッダー形式を理解しています.bmpファイル形式に関するwiki記事を読みました.私の主な問題は、.bmpを実際に内部に入れて各ピクセルとやり取りしたいときに、.bmpとやり取りする方法が本当にわからないことです.画像から。私は本当にすべてを必要としませんが、.bmp から各ピクセルを取得し、ピクセルの色をファイルなどに出力する例にすぎません。私のC ++は少し錆びています(最近Javaとjavscriptをやっています)。

4

2 に答える 2

4

既知の形式の BMP を読みたいが、それがどのように行われるか (つまり、内部のみのもの) を気にしない場合は、BMP を取得し、ヘッダーを無視して、それをピクセル配列として使用できます。左下から 1 行ずつ格納されます。圧縮方法には細かな問題がいくつかありますが、私の経験では、32bpp イメージを使用する場合は完全に無視できます。

本当に簡単な例として:

unsigned int *buffer;
void readfile() {
    FILE *f = fopen("file.bmp", "rb");
    buffer = new unsigned int[132*65];
    fseek(f, 54);
    fread(buffer, 132*65*4, 1, f);
    fclose(f);
}

unsigned int getpixel(int x, int y) {
    //assuming your x/y starts from top left, like I usually do
    return buffer[(64 - y) * 132 + x];
}
于 2012-04-12T14:28:50.920 に答える
1

私は同じ問題を抱えていましたが、BMP ファイル形式の記述を読み取ることで、.BMP ファイルを読み取って配列に格納する関数を作成しました。たぶん、この機能はあなたを助けることができます:

unsigned int PIC::BinToNum(char *b,int bytes)
{
    unsigned int tmpx = 0;
    unsigned int pw = 1;
    for(int i=0;i<bytes;i++)
    {
        tmpx += ((unsigned char)b[i]* pw);
        pw = pw * 256;
    }
    return tmpx;
}

int PIC::Open(const char *path)
{
    int pad = 0;
    unsigned int sof = 0;
    unsigned int tx = 0;
    char tmp[4] = {0,0,0,0};
    fstream file;
    file.open(path,ios::in);
    if(file.fail())
    {
        width=height=ColorBits=size=0;
        return -1;
    }
    else
    {
        file.seekg(0,ios::beg);
        file.read(tmp,2);
        if(!(tmp[0] == 66 && tmp[1] == 77))
        {
            width=height=ColorBits=size=0;
            return 0;
        }
        else
        {
            file.seekg(2,ios::beg); // 0x2 size
            file.read(tmp,4);
            size = BinToNum(tmp,4);
            file.seekg(18,ios::beg); // 0x12 width
            file.read(tmp,4);
            width = BinToNum(tmp,4);
            file.seekg(22,ios::beg); // 0x16 height
            file.read(tmp,4);
            height = BinToNum(tmp,4);
            file.seekg(28,ios::beg); // 0x1C Bits per Pixel
            file.read(tmp,2);
            ColorBits = BinToNum(tmp,2);
            file.seekg(10,ios::beg); // 0x0A start offset
            file.read(tmp,4);
            sof=BinToNum(tmp,4);
            file.seekg(34,ios::beg); // 0x22 Padding
            file.read(tmp,4);
            pad = BinToNum(tmp,4);
            pad = (int)(pad / height); // Compute Spacing in each row
            pad = pad - (width*ColorBits/8);

            // Initialize Matrix//
            matrix = new(unsigned int[height*width]);

            for(int h=height-1;h>=0;h--)
            {
                for(int w=0;w<=width-1;w++)
                {
                    file.seekg(sof,ios::beg);
                    file.read(tmp,(int)(ColorBits/8));
                    tx = BinToNum(tmp,(int)(ColorBits/8));
                    matrix[(h*width)+w] = tx;
                    sof+=(int)(ColorBits/8);
                }
                sof +=pad;
            }
        }
    }
    file.close();
    return 1;
}


Note:This functions is member of a class that i named it "PIC"...
于 2013-03-26T12:44:44.887 に答える