1

Haar 変換を bmp 画像のピクセルに適用する C++ コマンド ライン アプリケーションを作成しています。ヘッダー情報を抽出し、ピクセルのバイト配列サイズを特定することに成功しました。char[pixelHeight][rowSizeInBytes] にファイルのピクセル データを入力した後、各ピクセル (使用している bmp の 24 ビット) をベクトルに読み込みます。それは私のマシンで動作していますが、ピクセルを表す char 配列を unsigned int に変換するための実装が安全であるか、慣用的な C++ の方法であるかどうかを知りたいです。リトル エンディアン アーキテクチャを想定しています。

unsigned char pixelData[infoHeader->pixelHeight][rowSize];
fseek(pFile, basicHeader->pixelDataOffset, SEEK_SET);
fread(&pixelData, pixelArraySize, 1, pFile);

for(int row = 0; row < infoHeader->pixelHeight; row++)
{
    for(int i = 0; i < rowSize; i = i + 3)
    {
        unsigned char blue = pixelData[row][i];
        unsigned char green = pixelData[row][i + 1];
        unsigned char red = pixelData[row][i + 2];

        char vals[4];
        vals[0] = blue;
        vals[1] = green;
        vals[2] = red;
        vals[3] = '\0';

        unsigned int pixelVal = *((unsigned int *)vals);

        pixelVec.push_back(pixelVal);
    }
}
4

1 に答える 1

4

いいえ、これは一義的です。システムのエンディアンに依存するのではなく、意味をコーディングする必要があります。例えば:

 unsigned int pixelVal = static_cast<unsigned int>(blue) |
     (static_cast<unsigned int>(green) << 8) |
     (static_cast<unsigned int>(red) << 16);

これは、符号なし整数の特定の値を持つベクトルを取得することが意図されていることを前提としています。特定のバイトを含むベクトルを取得することが意図されている場合は、符号なし整数ではなく、バイト サイズの構造体のベクトルを使用する必要があります。

于 2013-01-16T19:44:25.583 に答える