将位图中的字节值 Header 写入文件

Writing Byte Values in Bitmap Header To File

我正在尝试将位图 header 写入文件。目前,我只想写 header 没有任何像素数据。我的值基于 this, this, and this。我有以下函数来组成一个标准的、未压缩的 24 位 RGB 位图 header 作为 uint8_t:

uint8_t* make_rgb24_bmp_header(int data_size, int width, int height)
    {
        uint8_t* ret = new uint8_t[BITMAP_HEADER_SIZE];

        //signature
        ret[0] = 'B';
        ret[1] = 'M';

        //2-3-4-5
        write_32bit_num_to_data(ret + 2, data_size); //file size in bytes as hexadecimal

        ret[6] = 0;
        ret[7] = 0;
        ret[8] = 0;
        ret[9] = 0;
        //specifies the starting offset of the image - 54 bytes in.
        ret[10] = 0x36;
        ret[11] = 0;
        ret[12] = 0;
        ret[13] = 0;
        //specifies header size - 40 bytes
        ret[14] = 28;
        ret[15] = 0;
        ret[16] = 0;
        ret[17] = 0;

        //18,19,20,21 - image width
        write_32bit_num_to_data(ret + 18, width);
        //20,23,24,25 - image height
        write_32bit_num_to_data(ret + 22, height);

        //planes - 1
        ret[26] = 1;
        ret[27] = 0;
        //bpp - 24
        ret[28] = 18;
        ret[29] = 0;
        //compression - 0
        ret[30] = 0;
        ret[31] = 0;
        ret[32] = 0;
        ret[33] = 0;

        //34,35,36,37
        write_32bit_num_to_data(ret + 34, data_size); //compressed size - no compression here, so same as data_size
        //38,39,40,41
        write_32bit_num_to_data(ret + 38, 2835); //Horizontal resolution in pixels per meter
        //42,43,44,45
        write_32bit_num_to_data(ret + 42, 2835); //Vertical resolution in pixels per meter

        //number of colors - not needed as we're not using a color palette
        ret[46] = 0;
        ret[47] = 0;
        ret[48] = 0;
        ret[49] = 0;

        //important colors - not needed
        ret[50] = 0;
        ret[51] = 0;
        ret[52] = 0;
        ret[53] = 0;

        return ret;
    }

我是这样保存的:

int main(int argc, char** argv)
{

    uint8_t* header = utils::make_rgb24_bmp_header(1244214, 720, 576);

    ofstream out;

    out.open("sample_header", ios::out | ios::binary);

    out.write((char*)&header, 54);

    out.close();

    return 0;
}

我希望文件的前两个字节为 44 4d,但当我在 Bless 中打开输出文件时,它们显示为 F0 E0。显然我错过了一些重要的东西(我也可以看到其余的值是不正确的),理解前两个字节哪里出了问题应该可以帮助我解决其余的问题。我该如何获得我期望的输出?

您将错误的值传递给 out.write:

out.write((char*)header, 54);

通过将它作为 &header 传递,您试图在指针存储的位置写出值,而不是它指向的位置(以及您的数据所在的位置)。