1

24 ビット ビットマップをロードし、2 つのヘッダーを読み取り、画像データを char* 変数に格納する ac/c++ プログラムを Linux ボックスで実行しています。変数の内容を生のバイナリ ファイルにダンプし、それを元のビットマップ + オフセットと比較することで、これが機能することを確認しました。私はHEREのコードを変更せずに使用し、RGB とボトムアップに注意して並べ替えます。

X、Y、幅、高さなどの座標のリストがある場合、これらをイメージのバイト オフセットに変換するにはどうすればよいでしょうか。

MY CODEでは、1 つのスキャンラインの幅とグリフの位置を計算して Y を見つけ、y+1 ごとにスキャンラインを追加していることがわかります。同様に、XI は一度に 3 バイトずつ繰り返します。最後に、これらの 3 バイトを一時的な文字配列に順番に格納します。

実際には、グリフは平滑化されていない 0xFF または 0x00 であるため、ピクセル データは必要ありません。私のビットがどこにあるかを確認するためにそれを含めました。

HEREは私が使用している画像です。

編集: - - - - - - - - - - - - - - - - - - - - - -

後述するように、私の数学は少し癖がありました。i、j、k ループの行を次のように修正しました。

tmpChar[i][j][k] = img.data[(((Y+j) * imgWidth) + (X + i)) * imgBPP + k];

私のプログラムの出力に関しては、ご覧のとおり、ビットマップを正常にロードし、ヘッダー情報は適切ですが、tmpChar 配列の内容をすべて 0xFF で表示しようとすると (符号付き int を使用したため、0xFF = -1 および 0x00 = +0)

4

2 に答える 2

1

画像のメモリ内のレイアウトは次のとおりです (R、G、B を逆にした可能性は無視してください)。

[R of pixel 0]  [G of pixel 0] [B of pixel 0] ....... [B of (0, imgWidth-1)] [R of pixel (1, 0)] .....

したがって、任意のピクセルのオフセットを計算するには: offset = ((Y * imgWidth) + X) * imgBPP + colorByte.

私が知る限り、あなたの内側のループに与えると、文字の X と Y が正しいと仮定します:

tmpChar[i][j][k] = img.data[(((Y+j) * imgWidth) + (x + i)) * imgBPP + k];
于 2012-12-08T20:14:58.983 に答える
0

BMPファイル形式で通常行われているように、ピクセルは逆さまの順序でメモリに保存されていると思います。

通常、ピクセルは通常の画像ラスタースキャンの順序に対して「逆さま」に保存され、左下隅から始まり、左から右に向かって、画像の下から上に向かって行ごとに格納されます。

そのため、コードが間違ったピクセルブロックを読み取っている可能性があります。

于 2012-12-08T21:39:14.140 に答える