用c++风格和C风格写一个bmp-header
Writing a bmp-header in C++ style vs C style
很久以前,我用C写了一个函数来写bmp-header。我使用二进制运算符将uint_16和uint_32直接解析为char[54]数组,这可以照顾到端序和可移植性。
我已经学习c++有一段时间了,现在我正试图用std::ofstream代替FILE*来用c++风格重写这个函数。我编写的c++代码看起来很糟糕,而且没有处理尾序。是否有更好或更合适的方法来处理c++头文件?(最好是可移植的,并且可以处理尾序)
当前是这样的:
void writeHeader(int width, int height, std::ofstream file)
{
char bmpSign[2] = {'B', 'M'};
uint filesize = width*height*3+54;
uint reserved = 0;
uint headersize = 54;
uint infoHeader = 40;
ushort colors = 1;
ushort bitsPerPixel = 24;
uint compression = 0;
uint imgSize = width*height*3;
uint xPels = 0;
uint yPels = 0;
uint usedColors = 0;
uint impColors = 0;
file.write(bmpSign, 2*sizeof(char));
file.write(reinterpret_cast<char*>(filesize), sizeof(int));
file.write(reinterpret_cast<char*>(reserved), sizeof(int));
file.write(reinterpret_cast<char*>(headersize), sizeof(int));
file.write(reinterpret_cast<char*>(infoHeader), sizeof(int));
file.write(reinterpret_cast<char*>(width), sizeof(int));
file.write(reinterpret_cast<char*>(height), sizeof(int));
file.write(reinterpret_cast<char*>(colors), sizeof(ushort));
file.write(reinterpret_cast<char*>(bitsPerPixel), sizeof(ushort));
file.write(reinterpret_cast<char*>(compression), sizeof(int));
file.write(reinterpret_cast<char*>(imgSize), sizeof(int));
file.write(reinterpret_cast<char*>(xPels), sizeof(int));
file.write(reinterpret_cast<char*>(yPels), sizeof(int));
file.write(reinterpret_cast<char*>(usedColors), sizeof(int));
file.write(reinterpret_cast<char*>(impColors), sizeof(int));
}
谢谢!
标题的c版本:
void parseInt16(uint16_t mem_head, uint8_t file_head[54], int offset)
{
file_head[offset] = (mem_head & 0x00ff);
file_head[offset + 1] = (mem_head & 0xff00) >> 8;
}
void parseInt32(uint32_t mem_head, uint8_t file_head[54], int offset)
{
file_head[offset] = (mem_head & 0x000000ff);
file_head[offset + 1] = (mem_head & 0x0000ff00) >> 8;
file_head[offset + 2] = (mem_head & 0x00ff0000) >> 16;
file_head[offset + 3] = (mem_head & 0xff000000) >> 24;
}
void writeHeader(int width, int height, FILE* bitmap_destination)
{
uint8_t bmp_header[54];
bmp_header[0] = 'B'; bmp_header[1] = 'M';
//parsing the 32 or 16 bit numbers into byte form, little-endian.
//function syntax: (value, Array of Bytes, Offset)
parseInt32(width * height * 3 + 54, bmp_header, 2); //filesize
parseInt32(0, bmp_header, 6); //reserved by software (0)
parseInt32(54, bmp_header, 10 ); //headerOffset / Header size
parseInt32(40, bmp_header, 14 ); //infoHeaderSize
parseInt32(width, bmp_header, 18); //Width in pixels
parseInt32(height, bmp_header, 22); //Height in pixels
parseInt16(1, bmp_header, 26); //Colors (1 per standard)
parseInt16(24, bmp_header, 28); //bitsPerPixel (3 bytes/p)
parseInt32(0, bmp_header, 30); //Compression (0 = none)
parseInt32(width * height * 3, bmp_header, 34); //Image Size(bytes)
parseInt32(0, bmp_header, 38); //xPelsPerMeter
parseInt32(0, bmp_header, 42); //yPelsPerMeter
parseInt32(0, bmp_header, 46); //Colors used (0 for all)
parseInt32(0, bmp_header, 50); //important Colors (0 for all)
fwrite(bmp_header, 1, 54, bitmap_destination); //writing the header to disk
}
处理平台端序的代码应该被重用。该代码与您使用FILE*
还是std::fstream
来写入数据无关。
唯一需要修改的行是
fwrite(bmp_header, 1, 54, bitmap_destination);
可以替换为:
file.write(reinterpret_cast<char*>(bmp_header), 54);
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- Qt VTK交互风格的信号到小部件
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 为什么一个简单的"Hello World"风格的程序不能用Turbo C++编译?
- 通过从当地的C风格阵列中返回指针来获取一个悬空的指针
- 将STD :: U8String复制到一个UTF8字符的C风格字符串中
- 使用CATCE进行BDD风格测试中多个数据的一个测试
- 封装一个c风格的缓冲区
- 如何在c++中编写一个调试宏来打印函数的所有参数(strace风格)
- 在结构体中复制一个c++风格的缓冲区
- 为什么我不需要解引用一个char指针来输出c风格的字符串?
- 编译和链接pimpl风格的类定义到一个库(c++)
- 是写一个按值函数参数的好风格
- 从函数返回一个动态的C风格字符串
- 用c++风格和C风格写一个bmp-header
- 如何使用c++ 11风格的强类型定义创建一个新的基本类型
- 如果tecgettextencodingfromminternetname()需要一个pascal风格的字符串,为什么在