如何将表示像素的char数组读取为unsigned int

时间:2013-01-16 19:37:10

标签: c++ casting

我正在编写一个C ++命令行应用程序,它将Haar变换应用于bmp图像的像素。我已经成功地提取了头信息并确定了像素的字节数组大小。在使用文件中的像素数据填充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);
    }
}

1 个答案:

答案 0 :(得分:4)

不,这是单一的。您应该编写您的意思而不是依赖于系统的字节顺序。例如:

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

这假设您的目的是获取具有无符号整数特定值的向量。如果您的目的是获取具有特定字节的向量,则应使用字节大小结构的向量,而不是无符号整数。

相关问题