用c++语言实现BMP文件的读写代码实现,以及结果
时间: 2024-02-28 16:55:43 浏览: 23
以下是C++语言实现BMP文件的读写代码示例:
```c++
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#pragma pack(push, 1)
// BMP文件头
struct BMPHeader {
char signature[2];
uint32_t fileSize;
uint32_t reserved;
uint32_t dataOffset;
};
// BMP信息头
struct BMPInfoHeader {
uint32_t size;
uint32_t width;
uint32_t height;
uint16_t planes;
uint16_t bitCount;
uint32_t compression;
uint32_t imageSize;
uint32_t xPixelsPerMeter;
uint32_t yPixelsPerMeter;
uint32_t colorsUsed;
uint32_t colorsImportant;
};
#pragma pack(pop)
// 读取BMP文件
vector<uint8_t> readBMP(const char *filename, BMPInfoHeader &infoHeader) {
ifstream file(filename, ios::binary);
BMPHeader header;
file.read(reinterpret_cast<char *>(&header), sizeof(BMPHeader));
if (header.signature[0] != 'B' || header.signature[1] != 'M') {
cerr << "Error: Invalid BMP file" << endl;
return vector<uint8_t>();
}
file.read(reinterpret_cast<char *>(&infoHeader), sizeof(BMPInfoHeader));
if (infoHeader.bitCount != 24) {
cerr << "Error: Only support 24-bit BMP file" << endl;
return vector<uint8_t>();
}
file.seekg(header.dataOffset, ios::beg);
vector<uint8_t> imageData(infoHeader.imageSize);
file.read(reinterpret_cast<char *>(imageData.data()), infoHeader.imageSize);
file.close();
return imageData;
}
// 写入BMP文件
bool writeBMP(const char *filename, const BMPInfoHeader &infoHeader, const vector<uint8_t> &imageData) {
ofstream file(filename, ios::binary);
BMPHeader header;
header.signature[0] = 'B';
header.signature[1] = 'M';
header.fileSize = sizeof(BMPHeader) + sizeof(BMPInfoHeader) + imageData.size();
header.reserved = 0;
header.dataOffset = sizeof(BMPHeader) + sizeof(BMPInfoHeader);
file.write(reinterpret_cast<char *>(&header), sizeof(BMPHeader));
file.write(reinterpret_cast<const char *>(&infoHeader), sizeof(BMPInfoHeader));
file.write(reinterpret_cast<const char *>(imageData.data()), imageData.size());
file.close();
return true;
}
int main() {
BMPInfoHeader infoHeader;
vector<uint8_t> imageData = readBMP("input.bmp", infoHeader);
// 处理BMP图像数据
writeBMP("output.bmp", infoHeader, imageData);
return 0;
}
```
该代码实现了BMP文件的读取和写入,使用了C++中的结构体和文件流操作。其中,`readBMP`函数可以读取BMP文件的文件头和图像数据,返回一个字节向量,`writeBMP`函数可以将图像数据写入BMP文件。
为了测试,可以使用24位BMP格式的图像文件作为输入文件,该程序将读入这个文件,然后将图像数据处理后写入一个新的文件。
需要注意的是,BMP文件是二进制文件,因此在读取和写入文件时需要使用二进制模式打开文件。
另外,由于BMP文件中的元素存储顺序可能与机器的存储顺序不同,因此在读取和写入文件时需要使用`pragma pack`指令来确保结构体的对齐方式。