将位图中的字节值 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 传递,您试图在指针存储的位置写出值,而不是它指向的位置(以及您的数据所在的位置)。
我正在尝试将位图 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 传递,您试图在指针存储的位置写出值,而不是它指向的位置(以及您的数据所在的位置)。